第三章 队列
队列的顺序实现
数据结构定义
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct {
LinkNode *front, *rear;
}LinkQueue;
初始化队列
void InitQueue(LinkQueue &Q){
Q.front = (LinkNode*)malloc(sizeof(LinkNode));
Q.rear = Q.front;
Q.front->next = NULL;
}
判队空
bool IsEmpty(LinkQueue Q){
if (Q.front == Q.rear) return true;
return false;
}
入队
void EnQueue(LinkQueue &Q, int x){
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x ;
s->next = NULL;
Q.rear->next = s;
Q.rear = s;
}
出队
bool DeQueue(LinkQueue &Q, int &x){
if(Q.front==Q.rear) return false;
LinkNode *p = Q.front->next;
x = p->data;
Q.front->next = p->next;
if(Q.rear == p)
Q.rear = Q.front;
free(p);
return true;
}
循环队列的实现
顺序队列的缺点
入队和出队时,front和rear均后移,造成假上溢
解决方案
将顺序表假想为首尾相连的环,每当front来到MaxSize-1时继续前进到0
通过取余运算实现
数据结构定义
#define MaxSize 50
typedef struct{
int data[MaxSize];
int front, rear;
}SqQueue;
初始化队列
void InitQueue(SqQueue &Q){
Q.front = 0;
Q.rear = 0;
}
判队空
bool IsEmpty(SqQueue Q){
if (Q.front==Q.rear) return true;
return false;
}
入队
bool EnQueue(SqQueue &Q, int x){
if ((Q.rear+1)%MaxSize == Q.front)
return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear+1)&MaxSize;
return true;
}
出队
bool DeQueue(SqQueue &Q, int &x){
if(Q.front==Q.rear)
return false;
x = Q.data[Q.front];
Q.front = (Q.front+1)%MaxSize;
return false;
}
王道课后习题
3.2.1 在循环队列中设置标志tag
数据结构不变,只是添加一个变量,区分是什么操作导致的front==rear
int tag = 0;
入队
bool tag_EnQueue(SqQueue &Q, int x){
if (Q.rear == Q.front && tag == 1)
return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear+1)&MaxSize;
tag = 1;
return true;
}
出队
bool DeQueue(SqQueue &Q, int &x){
if(Q.front==Q.rear && tag==0)
return false;
x = Q.data[Q.front];
Q.front = (Q.front+1)%MaxSize;
tag = 0;
return false;
}
3.2.2 用栈实现队列中的元素逆置
将队列Q的元素出队后立即入栈,再出栈后入队
void reverse_Q(SqStack &S, LinkQueue Q){
int x;
while(!IsEmpty(Q)){
DeQueue(Q, x);
Push(S, x);
}
while (!StackEmpty(S)) {
Pop(S, x);
Push(S, x);
}
}
3.2.3 用两个栈来模拟一个队列
入队
bool two_EnQueue(SqStack &S1, SqStack &S2, int e){
if(S1.top == MAXSIZE-1 && !StackEmpty(S2))
return false;
else if(S1.top != MAXSIZE-1) {
Push(S1, e);
return true;
}
else if(S1.top == MAXSIZE-1 && StackEmpty(S2)){
int x=0;
while(!StackEmpty(S1)){
Pop(S1, x);
Push(S2, x);
}
Push(S1, e);
return true;
}
return false;
}
出队
bool two_DeQueue(SqStack &S1, SqStack &S2, int &e){
if(!StackEmpty(S2)){
Pop(S2, e);
return true;
}
else if (StackEmpty(S2) && !StackEmpty(S1)){
while(!StackEmpty(S1)){
Pop(S1, e);
Push(S2, e);
}
Pop(S2, e);
return true;
}
else
return false;
}
|