堆栈的使用【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;
}
时间: 2024-12-30 03:21:00

堆栈的使用【ACM】的相关文章

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

ACM课程学习总结

ACM课程学习总结报告 通过一个学期的ACM课程的学习,我学习了到了许多算法方面的知识,感受到了算法知识的精彩与博大,以及算法在解决问题时的巨大作用.此篇ACM课程学习总结报告将从以下方面展开: 学习ACM算法知识之前的具备的知识基础 学习过程及知识梳理 心得体会及收获 一,学习ACM算法知识之前具备的知识基础 在开始这一学期的课程之前,大一上学期及寒假期间我学习了C++标准库中的STL,了解了一些通用操作,各种类型的容器的特性,以及一些算法.关于算法,只学习了一些简单的遍历,递归.并未深入学习

转载 ACM训练计划

leetcode代码 利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode.com/problems/longest-valid-parentheses/ (也可以用一维数组,贪心)http://oj.leetcode.com/problems/valid-parentheses/http://oj.leetcode.com/problems/largest-rectang

剪辑的楼天城的ACM之路

楼天城楼教主的acm心路历程(剪辑) 利用假期空闲之时,将这几年GCJ,ACM,TopCoder 参加的一些重要比赛作个回顾.昨天是GCJ2006 的回忆,今天时间上更早一些吧,我现在还清晰记得3 年前,我刚刚参加ACM 时参加北京赛区2005 和杭州赛区2005 的情况.2005 年ACM-ICPC——酸甜苦辣我进入清华大学开始本科学习的时间是2004 年8 月,在进入清华大学的第一年里,由于基础课学习比较紧张,再加上计算机系不允许大一学生自带电脑,我没有参加2004 年的ACM 比赛.不过在

牛人的ACM经验 (转)

一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈树,解答树等) 3,文件操作(从文本文件中读入数据并输出到文本文 件中) 4,图(基本概念,存储结构,图的运算) 数学知识 1,离散数学知识的应用(如排列组合.简单的图论,数 理逻辑) 2,数论知识 3,线性代数 4,组合代数 5,计算几何 二 算法 1,排序算法(冒抛法,插入排序,合并排序,快速排 序,堆排序) 2,查找(顺序查找,二分发) 3,回溯算法 4,递归算

中国大学生编程第一人:楼天城楼教主的acm心路历程

作为acm爱好者,分享下楼教主的故事,作为勉励 利用假期空闲之时,将这几年GCJ,ACM,TopCoder 参加的一些重要比赛作个回顾.昨天是GCJ2006 的回忆,今天时间上更早一些吧,我现在还清晰记得3 年前,我刚刚参加ACM 时参加北京赛区2005 和杭州赛区2005 的情况.2005 年ACM-ICPC——酸甜苦辣我进入清华大学开始本科学习的时间是2004 年8 月,在进入清华大学的第一年里,由于基础课学习比较紧张,再加上计算机系不允许大一学生自带电脑,我没有参加2004 年的ACM 比

ACM程序设计报告

ACM程序设计报告 - -王浩 14级计算机4班 通过十六周的acm程序设计实习,感受颇深,acm不仅仅是对编程能力的锻炼,更是对逻辑思维能力的提升.从第一专题到第四专题,stl,贪心算法,搜索,背包,动态规划,图论,最小生成树等等,这些知识都是之前在各门课中接触到过的,但是在acm中,我对算法有了一个新的认识,也对之前学的知识有了更深入的认识. 对acm的认识是从大一开始的,当时在东校的时候也是到本部参加了一段时间的acm程序设计课,当时接触的东西比较少,而且是光学了C语言,对程序设计的理解非

C++ STL泛型编程——在ACM中的运用

学习过C++的朋友们应该对STL和泛型编程这两个名词不会陌生.两者之间的关系不言而喻,泛型编程的思想促使了STL的诞生,而STL则很好地体现了泛型编程这种思想.这次想简单说一下STL在ACM中的一些应用.我们知道,在ACM竞赛中,经常需要用到数组.字符串.队列.堆栈.链表等数据结构和排序.搜索等算法,以提高程序的时间.空间运行效率.然而如果这些数据结构总是需要手工来编写,那无疑会是一件很麻烦的工作,而STL的出现很好地解决了这个问题. 我们简单来了解一下STL.STL提供了三种类型的组件:容器.

PAT-l3-002堆栈

L3-002. 堆栈 大家都知道"堆栈"是一种"先进后出"的线性结构,基本操作有"入栈"(将新元素插入栈顶)和"出栈"(将栈顶元素的值返回并从堆栈中将其删除).现请你实现一种特殊的堆栈,它多了一种操作叫"查中值",即返回堆栈中所有元素的中值.对于N个元素,若N是偶数,则中值定义为第N/2个最小元:若N是奇数,则中值定义为第(N+1)/2个最小元. 输入格式: 输入第一行给出正整数N(<= 105).随