基本思想:
两个栈A/B,将A看做缓存,每次入栈进A,然后A信息出栈后倒叙进B栈,向外输出时从B栈输出。需要注意A栈向B栈同步信息时需要先保证B栈已全部输出
(西交wrong):
#include <iostream>
#include <stack>
#include <stdio.h>
#define ERR -99999999
using namespace std;
stack<int> st1,st2;
bool push(int x)
{
st1.push(x);
return 1;
}
bool pop()
{
int x;
if(st2.empty())
while(!st1.empty()) //A栈信息同步B栈
{
x = st1.top(); //取st1的栈顶元素保存在x中
st1.pop(); //从st1中将已取的栈顶元素弹出
st2.push(x); //将st1中取出的元素保存在B中
}
if(st2.empty()) return 0;//如果执行过A同步后B仍然为空,说明A也为空,是否应对A状态判断?
st2.pop();
return 1;
}
int que_front() //返回队首元素
{
int x;
if(st2.empty())
while(!st1.empty()) //A栈信息同步B栈
{
x = st1.top(); //取st1的栈顶元素保存在x中
st1.pop(); //从st1中将已取的栈顶元素弹出
st2.push(x); //将st1中取出的元素保存在B中
}
if(st2.empty()) return ERR;//如果执行过A同步后B仍然为空,说明A也为空,是否应对A状态判断?
return st2.top();
}
int main()
{
int n; //n为操作个数
char op[10]; //判断输入操作
int ret; //ret保存返回值
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",&op);
if(op[0] == 'q')
{
ret = que_front();
if(ret != ERR)
printf("front is %d\n",ret);
else
printf("front isn't exist\n");
}
else if(op[0] == 'p' && op[1] == 'o')
{
ret =pop();
if(ret) printf("success pop\n");
else printf("fail pop\n");
}
else if((op[0] == 'p') && (op[1] == 'u'))
{
int x;
scanf("%d",&x);
ret = push(x);
if(ret) printf("success push\n");
else printf("fail push\n");
}
}
return 0;
}
(感谢西交wrong学长提供以上题目练习)