目录
栈的基本操作
要求:
总时间限制: 1000ms
内存限制: 1000kB
描述:
栈是一种重要的数据结构,它具有push k和pop操作。push k是将数字k加入到栈中,pop则是从栈中取一个数出来。
栈是后进先出的:把栈也看成横向的一个通道,则push k是将k放到栈的最右边,而pop也是从栈的最右边取出一个数。
假设栈当前从左至右含有1和2两个数,则执行push 5和pop操作示例图如下:
push 5 pop
栈 1 2 -------> 1 2 5 ------> 1 2
现在,假设栈是空的。给定一系列push k和pop操作之后,输出栈中存储的数字。若栈已经空了,仍然接收到pop操作,
则输出error。
输入:
第一行为m,表示有m组测试输入,m<100。
每组第一行为n,表示下列有n行push k或pop操作。(n<150)
接下来n行,每行是push k或者pop,其中k是一个整数。
(输入保证同时在栈中的数不会超过100个)
输出:
对每组测试数据输出一行。该行内容在正常情况下,是栈中从左到右存储的数字,数字直接以一个空格分隔,如果栈空,则不作输出;但若操作过程中出现栈已空仍然收到pop,则输出error。
样例输入:
2 4 push 1 push 3 pop push 5 1 pop
样例输出:
1 5 error
思路分析:
乍一看,设一个stack,按照输入要求一步步做就OK,但是注意到正常情况下要输出栈中从左到右存储的数字,即就是从栈底到栈顶,如果单单用stack,是无法实现这一操作的.(因为栈只能从栈顶进行操作)
一个朴素的想法是用线性数组来模拟栈的操作,但是更方便的想法是用比较陌生的deque(双端队列),接下来在I/O方面多加注意就可以了.
最终代码:
#include<iostream>
#include<deque>
using namespace std;
int main(){
int m;
scanf("%d",&m);
deque<int> stk;// try to use deque instead of array
for(int i=0;i<m;i++){
int n;
scanf("%d",&n);
bool tag=true;
for(int j=0;j<n;j++){
char str[5]; int k;
scanf("%s",str);
if(str[1]=='u'){
scanf("%d",&k);// I/O is important
if(!tag) continue;
stk.push_back(k);
}
else{
if(!tag) continue;
if(stk.empty()){
printf("error\n");
tag=false;
}
else{
stk.pop_back();
}
}
}
if(tag){
while(!stk.empty()){
printf("%d ",stk.front());
stk.pop_front();
}
printf("\n");
}
stk.clear();
}
}