【模板】栈
题目描述
请你实现一个栈(stack),支持如下操作:
push(x)
:向栈中加入一个数 x x x。pop()
:将栈顶弹出。如果此时栈为空则不进行弹出操作,输出Empty
。query()
:输出栈顶元素,如果此时栈为空则输出Anguei!
。size()
:输出此时栈内元素个数。
输入格式
本题单测试点内有多组数据。
输入第一行是一个整数 T T T,表示数据组数。对于每组数据,格式如下:
每组数据第一行是一个整数,表示操作的次数 n n n。
接下来 n n n 行,每行首先由一个字符串,为 push
,pop
,query
和 size
之一。若为 push
,则其后有一个整数 x x x,表示要被加入的数, x x x 和字符串之间用空格隔开;若不是 push
,则本行没有其它内容。
输出格式
对于每组数据,按照「题目描述」中的要求依次输出。每次输出占一行。
样例 #1
样例输入 #1
2
5
push 2
query
size
pop
query
3
pop
query
size
样例输出 #1
2
1
Anguei!
Empty
Anguei!
0
提示
样例 1 解释
对于第二组数据,始终为空,所以 pop
和 query
均需要输出对应字符串。栈的 size 为 0。
数据规模与约定
对于全部的测试点,保证 1 ≤ T , n ≤ 1 0 6 1 \leq T, n\leq 10^6 1≤T,n≤106,且单个测试点内的 n n n 之和不超过 1 0 6 10^6 106,即 ∑ n ≤ 1 0 6 \sum n \leq 10^6 ∑n≤106。保证 0 ≤ x < 2 64 0 \leq x \lt 2^{64} 0≤x<264。
提示
- 请注意大量数据读入对程序效率造成的影响。
- 因为一开始数据造错了,请注意输出的
Empty
不含叹号,Anguei!
含有叹号。
思路
首先,定义一个无符号长整形的栈stk。读取测试用例的数量t。针对每一个测试用例,先清空栈,然后读取操作的数量n。
接下来进行n次操作,每次操作首先读取操作指令op。如果指令是"push",则读取一个无符号长整型的数x,并将其压入栈中;如果指令是"pop",则弹出栈顶元素,如果栈为空则输出"Empty";如果指令是"query",则输出栈顶元素,如果栈为空则输出"Anguei!“;如果指令是"size”,则输出栈的大小。
注意:x 的值可能会很大,所以要用 unsigned long long,否则无法通过部分测试点。
AC代码
#include <iostream>
#include <stack>
#define ull unsigned long long
#define AUTHOR "HEX9CF"
using namespace std;const int N = 1e7 + 7;stack<ull> stk;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin >> t;while (t--) {while (stk.size()) {stk.pop();}int n;cin >> n;while (n--) {string op;cin >> op;if (op == "push") {ull x;cin >> x;stk.push(x);} else if (op == "pop") {if (stk.size()) {stk.pop();} else {cout << "Empty" << endl;}} else if (op == "query") {if (stk.size()) {cout << stk.top() << endl;} else {cout << "Anguei!" << endl;}} else if (op == "size") {cout << stk.size() << endl;}}}
}