基础实验3-2.5 堆栈模拟队列 (25分)
题目选自PTA上堆栈模拟队列
因为堆栈是后进先出,队列是先进先出,所以堆栈倒过来输出就是队列的输出了。
那么我们用两个堆栈,一个模拟入列,一个模拟出列。题目首先是给了两个数字,要想
清楚哪个作为入队的堆栈,仔细想想很快发现只有小堆栈能做入队模拟 //因为大的如果作为入队,输出的时候要将入队的堆栈全部放入出队的堆栈,这样会导致放不下
所以现在思路就很清晰了,然后要思考两个问题,入队时S1满了怎么办?(这时S2还有空位) 出队列时S2空了怎么办?(S1还有元素) .
很显然哈 S1满了的话就把S1的元素挪到S2中,注意:S2不空的时候是不能往里面挪用元素的。
S2空了的话将S1的元素挪入S2再输出。
现在附上AC代码 o.o 第一次写题解 谢谢观看
#include
#include
//想法就是一个输入栈 一个输出栈
//输入栈放满了 就放到输出栈
//输出栈不为0时不可放入其他元素
//输出时 如果输出栈有就直接输出
//没有就将输入栈的数字全部装入输出栈
//在输出
using namespace std ;
int M1,M2 ;
int top1=-1,top2=-1;
int a[1000],b[1000];
int main()
{
char c =0 ;
cin >> M1 >> M2 ;
int mins = min(M1,M2) ;
int maxx = max(M1,M2) ;
do
{
cin >> c ;
if(c==‘A’)
{
int x ;
cin >> x ;
if(top1<mins-1) //top最多放到1;
{
a[++top1] = x ;
}
else if(top2==-1 ) //将A的转移到B
{
while( top1!=-1 )
{
b[++top2] = a[top1–] ;
} // 腾过去后
a[++top1] = x; //把x赋值
}
else
{
cout << "ERROR:Full" << endl ;
}
}
else if ( c=='D') //把A移到B直到 TOP1=0
{
if(top2!=-1)
{
cout << b[top2--] << endl ;
}
else if(top1!=-1)
{
while(top1!=-1)
{
b[++top2] = a[top1--] ;
}
cout << b[top2--] << endl ;
}
else
{
cout << "ERROR:Empty" <<endl ;
}
}
}while(c!=‘T’) ;
}