注意事项
1.循环队列有三种判空方法
2.链队没有队满的问题,所以入队的时候无需判断队满
循环队列的判空方法
1.增加额外的一个空间判重,当进队时用(rear+1)%MAXSIZE == front检查
2.定义增加一个size表示队列的出队
3.定义里增加一个标记tag,tag为0出队则队空,tag为1入队则溢出
队列定义
//静态队列
typedef struct {
int data[MAXSIZE];
int rear,front;
}SqQueue;
//链队
typedef struct LQNode{
int data;
struct LQNode *next;
}LQNode;
typedef struct LQueue{
LQNode *front,*rear;
}*LinkQueue;
操作代码
////静态队列
//初始化队列
void InitQueue(SqQueue &q){
q.front = 0;
q.rear = 0;
}
//判队空
bool QueueEmpty(SqQueue &q){
if(q.front == q.rear)return true;
else return false;
}
//入队
bool EnQueue(SqQueue &q,int x){
if(q.rear == MAXSIZE-1)return false;
q.data[q.rear++] = x;
return true;
}
//出队
bool DeQueue(SqQueue &q,int &e){
if(q.front == q.rear)return false;
e = q.data[q.front++];
return true;
}
//读取队头元素
bool GetHead(SqQueue q,int &e){
if(q.front==q.rear)return false;
e = q.data[q.front];
return true;
}
////循环队列操作
//初始化队列
void InitCQueue(SqQueue &q){
q.front = 0;
q.rear = 0;
}
//判队空
bool QueueCEmpty(SqQueue &q){
if(q.front == q.rear)return true;
else return false;
}
//入队
bool EnCQueue(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 DeCQueue(SqQueue &q,int &e){
if(q.front == q.rear) return false;
e = q.data[q.front];
q.front = (q.front+1)%MAXSIZE;
return true;
}
//读取队头元素
bool GetCHead(SqQueue q,int &e){
if(q.front==q.rear)return false;
e = q.data[q.front];
return true;
}
////带头链队操作
//链队初始化
void InitLQueue(LinkQueue &q){
q.front = q.rear = (LQNode*)malloc(sizeof(LQNode));
q.front->next = NULL;
}
//链队判空
bool EmptyLQueue(LinkQueue &q){
if(q.front == q.rear)return true;
else return false;
}
//链队进队
void EnLQueue(LinkQueue &q,int x){
LQNode *s = (LQNode*)malloc(sizeof(LQNode));
s->data = x;
s->next = NULL;
q.rear->next = s;
q.rear = s;
}
//链队出队
bool DeLQueue(LinkQueue &q,int &e){
if(q.front == q.rear)return false;
LNode *s = q.front->next;
e = q.front->data;
q.front->next = s->next;
if(q.front == s){
q.front = q.rear;
}
free(s)
return true;
}