堆栈模拟队列(第七周编程题)

标题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;
}

posted @ 2019-10-12 11:06  爱和九九  阅读(46)  评论(0)    收藏  举报