已知条件:
栈S1与栈S2,有判断栈满函数Isfull(),判栈空IsEmpty(),入栈push(),出栈pop();用这些基本操作来实现EnQueue(),DeQueue(),IsQueueEmpty()函数;
基本思路:栈具有先进后出的特性,所以我们用s1来存储进队的元素,用s2来出队,在这个过程中,由于s1出栈的数据是逆序的,再压入s2再次逆序,那么从s2输出的数据就是正常顺序的,用这样的思路模拟一个队列。
需要注意的点是:模拟入队和出队的时候,需要判断s1是否已满,以及s2是否为空,当s1满的时候,无法入队,若s2非空,那么需要将s2元素全部出队后再将s1中所有元素压入s2中。
#include<iostream>
using namespace std;
int enQueue(Stack &s1,Stack &s2,int x)
{
int t;//设置一个变量去存储进出栈的数据;
//s1满,再去判断s2是否为空,若为空就将s1中元素全部压入s2,再将x压入s1;
if(isfull(s1)){
if(isEmpty(s2)){
while(!isEmpty(s1)){
pop(s1,t);
push(s2,t);
}
push(s1,x);
return 1;
}
//在s1已满的情况下,如果s2非空,那么此时队列已满,无法入栈,返回0;
else{
cout <<"队列已满,无法入队"<<endl;
return 0;
}
}
//s1没有满,直接将x入栈就行;
else{
push(s1,x);
return 1;
}
}
int deQueue(Stack &s1,Stack &s2,int &x){
int t;
//出队的时候,如果s2未空,直接出栈;
if(isEmpty(s2)){
pop(s2,t);
return 1;
}
//若s2为空,再去判断s1中是否为空,如果非空,先全部压到s2中,再从s2中pop;
else{
//在s2为空的情况下,s1为空的话,那么此时队列为空,无法出队;
if(isEmpty(s1)){
cout << "队列为空"<<endl;
return 0;
}
else{
while(!isEmpty(s1)){
pop(s1,t);
push(s2,t);
}
pop(s2,x);
return 1;
}
}
}
int isQueueEmpty(Stack s1,stack s2){
if(isEmpty(s1)&&isEmpty(s2)){
return 1;
}
else{
return 0;
}
}