- 请利用两个队列Q1和Q2来模拟一个栈。已知队列的三个运算定义如下:
bool EnQueue(Queue &Q , int e); //插入一个元素e入队列;
bool DeQueue(Queue &Q , int e); //删除一个元素e出队列;
bool QueueEmpty(Queue Q); //判别队列是否为空
假设数据结构Queue已定义,栈stack的数据结构定义如下:
typedef struct{
Queue Q1;
Queue Q2;
}Stack;
请利用队列的运算来实现该栈的三个运算:
push(ST , x); //元素x入ST栈
pop(ST , x); //ST栈顶元素出栈,赋给变量x;
StackEmpty(ST); //判断栈是否为空
//把Q2当作辅助队列,Q1看作栈。将所有的Q1元素压入Q2,当新元素入栈时,先将新元素压入Q1,再把Q2元素压入Q1,即可完成
//模拟栈的操作。
bool push(Stack &ST , int x){
int e;
while(!QueueEmpty(ST.Q1)){
DeQueue(ST.Q1 , e);
EnQueue(ST.Q2 , e);
}
EnQueue(ST.Q1 , x);
while(!QueueEmpty(ST.Q2)){
DeQueue(ST.Q2 , e);
EnQueue(ST.Q1 , e);
}
}
//直接pop队列Q1即可
bool pop(Stack &ST , int &x){
if(QueueEmpty(ST.Q1))
return 0;
else{
DeQueue(ST.Q1 , x);
return 1;
}
}
bool StackEmpty(Stack &ST){
return QueueEmpty(ST.Q1) && QueueEmpty(ST.Q2);
}
- 请利用两个栈S1和S2来模拟一个队列。已知栈的三个运算定义如下:
push(Stack ST,int x):元素x入ST栈;
pop(Stack ST,int x):ST栈顶元素出栈,赋给变量x;
StackEmpty(Stack ST):判ST栈是否为空。
那么如何利用栈的运算来实现该队列的三个运算:
EnQueue:插入一个元素入队列;
DeQueue:删除一个元素出队列;
QueueEmpty:判队列为空。
void EnQueue(Stack &S1 , Stack &S2, int x){
int e;
if(StackEmpty(S1)){
push(S1 , x);
}
else{
if(StackEmpty(S2)){
while(!StackEmpty(S1)){
pop(S1 , e);
push(S2 , e);
}
}
push(S1 , x);
}
}
bool DeQueue(Stackc &S1 , Stack &S2 , int &x){
int e;
if(StackEmpty(S1) && StackEmpty(S2))
return 0;
else{
if(!StackEmpty(S2))
pop(ST2 , x);
else{
while(!StackEmpty(S1)){
pop(S1 , e);
push(S2 , e);
}
pop(S2 , x);
}
return 1;
}
}
bool QueueEmpty(Stack S1 , Stack s2){
return StackEmpty(S1) && StackEmpty(S2);
}