堆栈模拟队列(第七周编程题)
标题7-1 堆栈模拟队列 (25 分)
设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。
所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数:
int IsFull(Stack S):判断堆栈S是否已满,返回1或0;
int IsEmpty (Stack S ):判断堆栈S是否为空,返回1或0;
void Push(Stack S, ElementType item ):将元素item压入堆栈S;
ElementType Pop(Stack S ):删除并返回S的栈顶元素。
实现队列的操作,即入队void AddQ(ElementType item)和出队ElementType DeleteQ()。
输入格式:
输入首先给出两个正整数N1和N2,表示堆栈S1和S2的最大容量。随后给出一系列的队列操作:A item表示将item入列(这里假设item为整型数字);D表示出队操作;T表示输入结束。
输出格式:
对输入中的每个D操作,输出相应出队的数字,或者错误信息ERROR:Empty。如果入队操作无法执行,也需要输出ERROR:Full。每个输出占1行。
输入样例:
3 2
A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T
输出样例:
ERROR:Full
1
ERROR:Full
2
3
4
7
8
ERROR:Empty
我的看法
两个栈,其实就是两个杯子,我们不防叫它cup1,cup2,用两个杯子倒来倒去,就能模拟出一个队列了。
cup1存进来,出栈是逆序,而出栈的时候将逆序的数据存入cup2,这时候cup2是逆序的,而cup2再出栈就会是逆序的逆序,即正序——队列的性质。
所以,push的时候只能从cup1进行,同样的,pop的也绝对是cup2里面的。如果cup1满了,就将cup1的数据倒入cup2;而如果cup2空了,也将cup1里的数据倒入cup2。
满栈是啥意思呢?其实就是小杯子满了(用户输入的两个杯子容量的大小关系不确定),大杯子是不可能满的。换句话说,用户输入的大数是没有价值的。不能像题干写的那样子S1对应N1,反正你自己得分清哪个小,就让那个做我所说的cup1.因为大杯子满了,是没办法把数据全部倒入小杯子里面的。
而为啥大杯子不可能满呢?因为在从cup1往cup2倒入数据的时候,必须保证cup2是空的,如果不是空的,而cup1还满了,这个时候队列就满了,输出FULL。而如果大杯子里面有东西,你还要往里面加,这个队列就乱了。
我的代码
#include<iostream>
#include<stack>
using namespace std;
int main() {
stack<int> S1, S2;
int smallsize, bigsize;
cin >> smallsize >> bigsize;
int tem;
if (smallsize > bigsize) {
tem = smallsize;
smallsize = bigsize;
bigsize = tem;
}
char a; int b;
cin >> a;
while (a != 'T') {
if (a == 'A') {
cin >> b;
if (S1.size() < smallsize) {
S1.push(b);
}
else {
if (!S2.empty()) {
cout << "ERROR:Full" << endl;
}
else {
while (!S1.empty()) {
S2.push(S1.top());
S1.pop();
}
S1.push(b);
}
}
}
else if (a == 'D') {
if (!S2.empty()) {
cout << S2.top() << endl;
S2.pop();
}
else {
if (S1.empty()) {
cout << "ERROR:Empty" << endl;
}
else {
while (!S1.empty()) {
S2.push(S1.top());
S1.pop();
}
cout << S2.top() << endl;
S2.pop();
}
}
}
cin >> a;
}
return 0;
}

浙公网安备 33010602011771号