7-4 堆栈模拟队列 (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
思路:
题目要求两个栈模拟一个队列,栈是先进后出,队列是先进先出,可以把这两个栈中最大容量较小的那个当成输入的栈A,另外一个当”缓冲区“栈B,刚开始数据都进去A,然后再从A转到B,这时候这些数据反过来了,从B出来的就是队列那种先进先出的形式了。所以我们可以分三种考虑的情况:
T的时候直接break
A的时候是入队,所以看看输入栈A情况:
若A不满,直接压A栈;若A满B空,把A中所有元素出栈压到B中,再把刚输入的元素压A栈。否则,full
D的时候出队,所以看看能不能出
若B不为空,直接出;若B空A空,输出empty;若B空A不空,把A中所有元素压B中
C++ AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//int转字符串的函数
string int_to_string(int num)
{
stringstream ss;
ss<<num;
string s;
ss>>s;
return s;
}
int main()
{
//A存放的栈 B缓冲区
stack<int> A;
stack<int> B;
vector<string> strs;
int max_A_size,max_B_size;
cin>>max_A_size>>max_B_size;
if(max_A_size>max_B_size)
{
swap(max_A_size,max_B_size);
}
char c;
while(1)
{
cin>>c;
//T的情况
if(c=='T')
{
break;
}
//A的情况
else if(c=='A')
{
int num;
cin>>num;
//A不满
if(A.size()<max_A_size)
{
A.push(num);
}
//A满,B空
else if(A.size()==max_A_size&&B.empty())
{
for(int i=0; i<max_A_size; i++)
{
B.push(A.top());
A.pop();
}
A.push(num);
}
else
{
strs.push_back("ERROR:Full");
}
}
//D的情况
else
{
//B不空,就出去
if(!B.empty())
{
strs.push_back(int_to_string(B.top()));
//cout<<B.top()<<"h"<<endl;
B.pop();
}
//B空A不空
else if(B.empty()&&A.size()!=0)
{
int len=A.size();//重点! 在这里将全部元素都放进缓冲区栈的时候,每放一个size都会变化,要注意!
for(int i=0; i<len; i++)
{
B.push(A.top());
//cout<<A.top()<<"s"<<endl;
A.pop();
}
strs.push_back(int_to_string(B.top()));
B.pop();
}
//队空
else if(B.empty()&&A.size()==0)
{
strs.push_back("ERROR:Empty");
}
}
}
//将刚才暂存于vector的数据遍历输出
for(vector<string>::iterator it=strs.begin();it!=strs.end();it++)
{
cout<<(*it)<<endl;
}
return 0;
}