栈
题目描述
请你实现一个栈(stack),支持如下操作:
push(x)
:向栈中加入一个数 $x$。pop()
:将栈顶弹出。如果此时栈为空则不进行弹出操作,输出Empty
。query()
:输出栈顶元素,如果此时栈为空则输出Anguei!
。size()
:输出此时栈内元素个数。
输入格式
本题单测试点内有多组数据。
输入第一行是一个整数 $T$,表示数据组数。对于每组数据,格式如下:
每组数据第一行是一个整数,表示操作的次数 $n$。
接下来 $n$ 行,每行首先由一个字符串,为 push
,pop
,query
和 size
之一。若为 push
,则其后有一个整数 $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 \leq T, n\leq 10^6$,且单个测试点内的 $n$ 之和不超过 $10^6$,即 $\sum n \leq 10^6$。保证 $0 \leq x \lt 2^{64}$。
提示
- 请注意大量数据读入对程序效率造成的影响。
- 因为一开始数据造错了,请注意输出的
Empty
不含叹号,Anguei!
含有叹号。
参考代码
#include<bits/stdc++.h>
using namespace std;
//定义宏 无符号 longlong 类型
#define ll unsigned long long
const ll N=1e+6;
ll a[N];
ll top;//栈 顶
//定义函数,模拟入栈
void push(ll x){
//入栈操作
//避免数组越界,栈溢出
if(top>=N-1)
return;
a[++top]=x;
}
//模拟出栈
void pop(){
//如果top==0时,
//说明栈里面是空的
if(top==0){
cout<<"Empty\n";return;
}
--top;
}
//模拟query,返回栈顶元素
ll query(){
//如果此时栈为空则输出 Anguei!。
if(top==0){
cout<<"Anguei!\n";return -1L;
}
return a[top];
}
int main(){
//T表示有几组数据
//n表示操作的次数
int T, n;
string s;
ll x;
cin>>T;
while(T>0){
T--;
cin>>n;
top = 0;
while(n>0){
n--;
cin>>s;
if(s=="push"){
cin>>x;
push(x);
}else if(s=="pop"){
pop();
}else if(s=="query"){
ll c=query();
if(c!=-1L){
cout<<c<<endl;
}
}else if(s=="size"){
cout<<top<<endl;
}
}
}
return 0;
}