思想如下:
栈先进后出,队列先进先出,所以需要两个栈模拟一个队列,
一个栈用于接收数据,另一个栈用于将数据的顺序逆置,使得先入栈的元素到达栈顶,实现“先出”,当仍有输入,而用于逆置数据的栈中留存数据,则无法将输入栈的数据放到逆置栈的栈底,出现满栈;由于输入序列需要存入逆置序列,并且只有输入序列满栈才应该把数据传入逆置栈,以实现最大队列容量,因而逆置序列要大于输入序列;此外,在需要进行出栈操作时,如果逆置栈空需要判断输入栈是否能压栈入逆置栈。
镇贴之宝:
【】
【】 【】
【】 【】
代码如下:
#include <iostream>
#include <stack>
using namespace std;
char getOperate();
int main()
{
int n1,n2,tranMax,inputMax,tranNow=0,inputNow=0;
cin>>n1>>n2;
if(n1>n2)
{tranMax=n1;inputMax=n2;}
else{tranMax=n2;inputMax=n1;}
stack<int> iStack,tStack;
int done=0,in;
while(!done)
{
//先判断是否逆置
if(inputNow==inputMax && tStack.empty())
{
while(!iStack.empty())
{
in=iStack.top();
iStack.pop();
tStack.push(in);
}
inputNow=0;
}
switch(getOperate())
{
case 'A':
cin>>in;
if(inputNow<inputMax)//PushInput
{
iStack.push(in);
inputNow++;
}
else
{
cout<<"ERROR:Full"<<endl;
}
break;
case 'D':
if( !tStack.empty() )
{
in=tStack.top();
tStack.pop();
cout<<in<<endl;
}
else if(tStack.empty() && !iStack.empty())
{
while(!iStack.empty())
{
in=iStack.top();
iStack.pop();
tStack.push(in);
}
inputNow=0;
in=tStack.top();
tStack.pop();
cout<<in<<endl;
}
else
cout<<"ERROR:Empty"<<endl;
break;
case 'T':
done=1;
break;
}//switch
}
return 0;
}
char getOperate()
{
char t;
cin>>t;
return t;
}