3-8 堆栈模拟队列 (25 分)
原创
©著作权归作者所有:来自51CTO博客作者mb5dbc2345bf8de的原创作品,请联系作者获取转载授权,否则将追究法律责任
设已知有两个堆栈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行。
题目思路:
1.不用真的去实现题目中说的那么多函数的功能,可以采用两个整形数组模拟一下即可。
2.想要达到队列先进先出的效果,那么一定是让数据在入栈以后,在另一个栈中“翻个身”,也就是说让小的栈作为输入栈,大的栈作为输出栈(因为小的栈够短,能够在大的栈中“翻身”)。
3.队空条件,两个栈(数组)都为空。
4.栈满条件,输入栈满了并且输出栈里还有元素。(自己在纸上画画,在这种条件下,如果进行“翻身”动作,那么原本在输出栈准备输出的元素就被压到下面了,不符合队列的规则)
#include<iostream>
using namespace std;
void swap(int& a, int& b){ int t = a; a = b; b = t;}
int main()
{
int m, n, x;
int st1[100], st2[100], k1 = 0, k2 = 0;
cin >> m >> n;
if(m < n) swap(m, n); //把小栈大小定位n,方便统一处理
char c;
while (cin >> c && c != 'T')
{
if (c == 'A')
{
cin >> x;
if (k2 == n && k1) //栈满
cout << "ERROR:Full\n";
else if (k2 < n)
st2[k2++] = x;
else if (k2 == n && !k1)
{
while (k2)//翻身
{
st1[k1++] = st2[--k2];
}
st2[k2++] = x; //翻身以后再输入
}
else
cout << "ERROR:Full\n";
}
else if (c == 'D')
{
if (!k1 && !k2)//栈空
cout << "ERROR:Empty\n";
else if (k1)
cout << st1[--k1] << endl;
else if (!k1 && k2)
{
while (k2) //翻身
{
st1[k1++] = st2[--k2];
}
cout << st1[--k1] << endl;//翻身以后再输出
}
}
}
return 0;
}