10.1-7 说明如何用两个队列来实现一个栈,并分析有关栈操作的运行时间。
QUEUE A,B
PUSH(S,x)
if A正在使用
if tail[A]+1=head[A]
error "upflow"
else
ENQUEUE(A,x)
else
if tail[B]+1=head[B]
error "upflow"
else
ENQUEUE(B,x)
POP(S)
if A正在使用
if QUEUE_EMPTY(A)
error "underflow"
else
while head[A]+1!=tail[A]
ENQUEUE(B,DEQUEUE(A))
return DEQUEUE(A)
else
if QUEUE_EMPTY(B)
error "underflow"
else
while head[B]+1!=tail[B]
ENQUEUE(A,DEQUEUE(B))
return DEQUEUE(B)
#include <iostream>
#include <string>
#define QUEUE_SIZE 50
using namespace std;
struct Queue{
int head,tail;
int list[QUEUE_SIZE];
};
bool empty_queue(Queue *q){
return q->tail==q->head;
}
void enqueue(Queue *q,int x){
if ((q->tail+1)%QUEUE_SIZE==q->head){
cout<<"upflow"<<endl;
}else{
q->list[(q->tail++)%QUEUE_SIZE]=x;
}
}
int dequeue(Queue *q){
if (empty_queue(q)){
cout<<"underflow"<<endl;
return NULL;
}else{
return q->list[(q->head++)%QUEUE_SIZE];
}
}
void push(Queue *q1,Queue *q2,int x){
if (empty_queue(q1)){
enqueue(q2,x);
}else{
enqueue(q1,x);
}
}
int pop(Queue *q1,Queue *q2){
if (empty_queue(q1)){
while (q2->tail!=(q2->head+1)){
enqueue(q1,dequeue(q2));
}
return dequeue(q2);
}else{
while (q1->tail!=(q1->head+1)){
enqueue(q2,dequeue(q1));
}
return dequeue(q1);
}
}