809数据结构和908数据结构与算法_练习 第3章 栈和队列
31.请利用两个栈S1和S2来模拟一个队列。已知栈的四个运算定义如下:PUSH(S,x):元素x入S栈;POP(S,x):S栈顶元素出栈,赋给变量x;Sempty(S):判断S栈是否为空;Soverflow(S):判断S栈是否为满。
试用栈的运算来实现该队列的三个运算:
(1)enqueue:插入一个元素入队列;
(2)dequeue:删除一个元素出队列;
(3)queue_empty:判队列为空。
分析:
此题看起来复杂,题目也很长,其实就是栈和队列的基本操作组合起来。队列的基本操作 入队、出队、判空,现在需要用两个栈来模拟这三个功能,那么这三个功能一个一个的分开实现,也就没那么复杂了。
算法思想:
入队时,先入栈S1(此时为逆序),出队时,先将S1的元素出栈再入栈到S2中(此时为顺序),再出栈。如果S1和S2都为空则队列为空。
(1)入队操作
bool enqueue(Stack* S1, Stack* S2, ElemType e) {
if (!Soverflow(S1)) { //S1不满,入栈
PUSH(S1, e);
return true;
}
if (Soverflow(S1) && !Sempty(S2)) { //S1满栈,S2不空则无法入队
return false;
}
if (Soverflow(S1) && Sempty(S2)) { //如果S1满,S2空
while (!Sempty(S1)) { //S1不空,出栈,S2入栈
POP(S1, x);
PUSH(S2, x);
}
}
PUSH(S1, e);
return true;
}
(2)出队操作
bool dequeue(Stack* S1, Stack* S2, ElemType x) {
if (!Sempty(S2)) { //S2不为空,出栈
POP(S2, x);
return true;
}
else {
return false;
}
if (Soverflow(S1)) { //S1栈满时,出栈,S2入栈
POP(S1, x);
PUSH(S2, x);
}
POP(S2, x);
return true;
}
(3)判空操作
bool queue_empty(Stack S1, Stack S2) {
if (Sempty(S1) && Sempty(S2)) { //S1,S2都不为空
return true;
}
return false;
}