两个栈 分别为 S1,S2, 已知栈的4个运算定义如下:
Push(S,x); //元素x入栈S
Pop(S,x); //S出栈并将出栈元素赋给 x
StackEmpty(S); //判断栈是否空
StackOverFlow(S); //判断栈是否满
实现队列的3个运算:
- 将元素 x 入队
bool Enqueue(Stack &S1, ElemType x){
//如果栈S1未满,可直接入栈
if(!StackOverFlow(S1)){
Push(S,x);
return true;
}
//判断是否队列满(栈S1满且栈S2不空)
if(StackOverFlow(S1)&&!StackEmpty(S2)){
return false;
}
//如果栈S2为空。则可以先将栈S1中的元素弹入栈S2中后,再入队
if(StackOverFlow(S1)&&StackEmpty(S2)){
while(!StackEmpty(S1)){
Pop(S1,t);
Push(S2,t);
}
}
Push(S1,x);
return true;
}
- 出队,并将出队元素存储在 x 中
bool Dequeue(Stack &S1, Stack &S2, ElemType &x){
//如果栈S2不为空,说明有调整好顺序的元素,直接弹出S2的栈顶元素
if(!StackEmpty(S2)){
Pop(S2,x);
return true;
}
//判断栈S1是否为空,若S1和S2都为空即队列为空,返回false
if(StackEmpty(S1)){
return false;
}
//若栈S1不空,则按照FIFO的规则,利用栈S2调整顺序
ElemType t;
while(!StackEmpty(S1)){
Pop(S1,t);
if(StackOverFlow(S2)){
return false;
}
Push(S2,t);
}
//弹出S2的栈顶元素,即为当前的队头元素
Pop(S2,x);
return true;
}
- 判断队列是否为空
bool QueueEmpty(Stack &S1, Stack &S2){
if(StackEmpty(S1)&&StackEmpty(S2)){
return true;
}
else
return false;
}