堆栈的使用ACM

Posted BBW

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆栈的使用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;
}

 

以上是关于堆栈的使用ACM的主要内容,如果未能解决你的问题,请参考以下文章

在后台堆栈中多次防止相同的片段

堆栈的使用ACM

来自后台堆栈的片段 onResume

从后台堆栈恢复片段时的 savedInstanceState

从堆栈中弹出特定片段并删除其他片段

使用片段返回堆栈处理 ActionBar 标题?