题目:设已知有两个堆栈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
思路
1、首先要比较两个堆栈的大小。容量小的堆栈(设为1)为队列输入使用,容量大的堆栈(设为2)为队列输出使用。
2、入队列:若堆栈1未满,把元素压入到堆栈1中;
若堆栈1满,且堆栈2为空,则把堆栈1中的所有元素pop到堆栈2中(所以说要堆栈2 的容量大于等于堆栈1的容量,否则全部元素不能都Pop出去),再将待入列的元素压入到堆栈1中;
若堆栈1满,且堆栈2不为空,则队列满,不能再有元素入列,输出ERROR:Full(因为1已经满了,此时不能再将元素压入1中;同时也不能再将1中的元素Pop出去再压入2中,因为2中已经有元素了,若再压入,其进队列的先后顺序就乱了)
3、出队列:若堆栈2不为空,则Pop堆栈2;
若堆栈2为空,堆栈1不为空,则把1中元素压入2中,再Pop堆栈2
若1和2都为空,则队列为空,输出ERROR:Empty
注意
此题中输入的数据不一定是一位整数,可能是多位整数
#include<iostream>
using namespace std;
int