堆栈的使用【ACM】
题目描述:
堆栈是一种基本的数据结构。堆栈具有两种基本操作方式,push 和 pop。Push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。
输入:
对于每组测试数据,第一行是一个正整数 n,0<n<=10000(n=0 结束)。而后的 n 行,每行的第一个字符可能是'P’或者'O’或者'A’;如果是'P’,后面还会跟着一个整数,表示把这个数据压入堆栈;如果是'O’,表示将栈顶的值 pop 出来,如果堆栈中没有元素时,忽略本次操作;如果是'A’,表示询问当前栈顶的值,如果当时栈为空,则输出'E'。堆栈开始为空。
输出:
对于每组测试数据,根据其中的命令字符来处理堆栈;并对所有的'A’操作,输出当时栈顶的值,每个占据一行,如果当时栈为空,则输出'E’。当每组测试数据完成后,输出一个空行。
样例输入:
3
A
P 5
A
4
P 3
P 6
O
A
0
样例输出:
E
5
3
结题思路:
本题是常规栈操作题,按照题目要求读取字符,根据字符做出操作,有几点需要注意的地方:
1、每组数据第一行为int型,表示操作次数,当为0时要停止。
2、当用%c读取每行的第一个操作数时,前面要加空格如 scanf(“ %c”,&tmp);这样可以过滤掉之前输入流中的空格或者换行。如果使用%s读数据就不用这么麻烦,只要考虑字符串第一位的值即可。
3、需要着重注意,当栈为空时不能进行退栈操作,会发生错误,每次进行退栈时要检查栈是否为空,只有当不为空时才能退栈。
解题代码:
#include<stack> #include<stdio.h> using namespace std; stack<int> buf; int main(){ //freopen("test.txt","r",stdin); int n; char s[10]; //scanf("%d",&n); while(scanf("%d",&n)!=EOF&&n!=0){ while(!buf.empty()) buf.pop(); //stack<char> buf; for(int i=0;i<n;i++){ //char tmp; int data; scanf("%s",s); if(s[0]=='P'){ scanf("%d",&data); //printf("%c\n",data); buf.push(data); } else if(s[0]=='O'){ if(!buf.empty()) buf.pop(); } else if(s[0]=='A'){ if(!buf.empty()) printf("%d\n",buf.top()); else printf("E\n"); } } printf("\n"); } return 0; }