Description
请你实现一个栈(stack),支持如下操作:
push(x)
:向栈中加入一个数 x。pop()
:将栈顶弹出。如果此时栈为空则不进行弹出操作,输出Empty
。query()
:输出栈顶元素,如果此时栈为空则输出Anguei!
。size()
:输出此时栈内元素个数。
Input
本题单测试点内有多组数据。
输入第一行是一个整数 T,表示数据组数。对于每组数据,格式如下:
每组数据第一行是一个整数,表示操作的次数 n。
接下来 n 行,每行首先由一个字符串,为 push
,pop
,query
和 size
之一。若为 push
,则其后有一个整数 x,表示要被加入的数,x 和字符串之间用空格隔开;若不是 push
,则本行没有其它内容。
Output
对于每组数据,按照「题目描述」中的要求依次输出。每次输出占一行。
Sample 1
Inputcopy | Outputcopy |
---|---|
2 5 push 2 query size pop query 3 pop query size | 2 1 Anguei! Empty Anguei! 0 |
Hint
样例 1 解释
对于第二组数据,始终为空,所以 pop
和 query
均需要输出对应字符串。栈的 size 为 0。
数据规模与约定
对于全部的测试点,保证 1≤T,n≤10^6,且单个测试点内的 n 之和不超过 10^6,即 ∑n≤10^6。保证 0≤x<2^64。
提示
- 请注意大量数据读入对程序效率造成的影响。
- 因为一开始数据造错了,请注意输出的
Empty
不含叹号,Anguei!
含有叹号。
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0); //这三行用于提高输出效率
cin.tie(0); //使用后不能再用endl,改用\n
cout.tie(0);
int T, n;//T表示数据组数,n表示操作的次数
for(cin>>T; T; --T) //输入T,有T组数据
{
//构建栈
//unsigned long long int是无符号长整型变量,用于数据比较大的时候
//每次都是一个新栈
stack<unsigned long long int>s;
for(cin>>n; n; --n)
{
string t;
cin >> t;
if(t == "push")
{
//x是属于栈里边的元素,也要unsigned long long int
unsigned long long int x;
cin >> x;
s.push(x);//入栈
}
else if(t == "pop")
{
if(s.empty())
{
cout << "Empty\n";
}//判空
else
{
s.pop();//出栈
}
}
else if(t == "query")
{
if(s.empty())
{
cout<<"Anguei!\n";
}
else
{
cout<<s.top()<<'\n';
}
}
else
{
cout<<s.size() <<'\n';
}
}
}
return 0;
}
这是一道需要用到蛮多知识点的题,需要注意的是:
- 提高效率的三行代码使用后不能再用endl,改用\n
- 测试用例中可能会有超大数据,所以需要用unsigned long long int
- for循环里的写法不常见
- bool类型取值只有两个,非零值被转为 true,零被转为 false
有关定义数据长度:
相关连接:
for循环到底怎么使用:for的用法详解,for循环完全攻略-CSDN博客
bool类型详解:C++:布尔类型(bool)详细分析_c++ bool-CSDN博客
有关三个提高代码效率:ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); 的作用和注意事项-CSDN博客
STL中stack的使用:stack的常见用法详解_stack用法-CSDN博客