一. 队列
1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表。
2.循环队列:把存储队列的顺序队列在逻辑上视为一个环。
循环队列状态:
初始时:Q.front=Q.rear=0
front指针移动:Q.front=(Q.front+1)%MaxSize
rear指针移动:Q.rear=(Q.rear+1)%MaxSize
队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
队空条件:Q.front=Q.rear
队满条件:Q.front=Q.rear
3.区分队空和队满的三种处理
1)牺牲一个存储单元来区分队空和队满
队满条件:(Q.rear+1)%MaxSize=Q.front
队空条件:Q.front=Q.rear
队中元素个数:(Q.rear+MaxSize-Q.front)%MaxSize
2)类型中增设表示元素个数的数据成员
队空条件:Q.front=Q.rear && Q.size=0
队满条件:Q.front=Q.rear && Q.size=MaxSize
3)类型中增设tag数据成员,以区分队空还是队满
tag=0时,若因删除导致Q.front=Q.rear,则为队空
tag=1时,若因插入导致Q.front=Q.rear,则为队满
二. 循环队列的顺序存储操作
1.结构描述
typedef struct Queue{ ElemType data[MaxSize]; int front,rear,size; }Queue;
2.初始化队列
Queue InitQueue() { Queue Q; Q.front=Q.rear=Q.size=0; return Q; }
3.判断队列是否为空
int Queue_Empty(Queue Q) { if(Q.front==Q.rear&&Q.size==0) return TRUE; else return FALSE; }
4.判断队列是否为满
int Queue_Full(Queue Q) { if(Q.front==Q.rear&&Q.size==MaxSize) return TRUE; else return FALSE; }
5.入队
int InQueue(Queue *q) { if(Queue_Full(*q)) return FALSE; ElemType x; printf("输入入队元素:"); scanf("%d",&x); q->data[q->rear]=x; q->rear=(q->rear+1)%MaxSize; q->size++; return TRUE; }
6.出队
int OutQueue(Queue *q,ElemType *x) { if(Queue_Empty(*q)) return FALSE; *x=q->data[q->front]; q->front=(q->front+1)%MaxSize; q->size--; return TRUE; }
7.完整代码
#include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define MaxSize 10 typedef int ElemType; typedef struct Queue{ ElemType data[MaxSize]; int front,rear,size; }Queue; Queue InitQueue();//初始化队列 int Queue_Empty(Queue Q);//判断队列是否为空 ,用size来判断空还是满 int Queue_Full(Queue Q);//判断队列是否满 int InQueue(Queue *q);//入队 int OutQueue(Queue *q,ElemType *x);//出队,并记录出队元素 int main() { ElemType x; Queue Q=InitQueue(); InQueue(&Q); InQueue(&Q); InQueue(&Q); InQueue(&Q); printf("此时队列长度:%d ",Q.size); return 0; } Queue InitQueue() { Queue Q; Q.front=Q.rear=Q.size=0; return Q; } int Queue_Empty(Queue Q) { if(Q.front==Q.rear&&Q.size==0) return TRUE; else return FALSE; } int Queue_Full(Queue Q) { if(Q.front==Q.rear&&Q.size==MaxSize) return TRUE; else return FALSE; } int InQueue(Queue *q) { if(Queue_Full(*q)) return FALSE; ElemType x; printf("输入入队元素:"); scanf("%d",&x); q->data[q->rear]=x; q->rear=(q->rear+1)%MaxSize; q->size++; return TRUE; } int OutQueue(Queue *q,ElemType *x) { if(Queue_Empty(*q)) return FALSE; *x=q->data[q->front]; q->front=(q->front+1)%MaxSize; q->size--; return TRUE; }
运行示例:
三. 队列的链式存储
链队列:同时带有队头指针和队尾指针的单链表。
1.结构描述
typedef struct Node{ ElemType data; struct Node *next; }Node; typedef struct Queue{ struct Node *front,*rear; }Queue;
2.链队列初始化
Queue InitQueue() { Queue Q; Q.front=Q.rear=(Node*)malloc(sizeof(Node)); Q.front->next=NULL; return Q; }
3.判断队列是否为空
int Queue_Empty(Queue Q) { if(Q.front==Q.rear) return TRUE; else return FALSE; }
4.入队
void InQueue(Queue *q) { ElemType x; printf("输入入队元素:"); scanf("%d",&x); Node *p=(Node*)malloc(sizeof(Node)); p->data=x; p->next=NULL; q->rear->next=p; q->rear=p; }
5.出队
int OutQueue(Queue *q,ElemType *x) { if(Queue_Empty(*q)) { return FALSE; } Node *p=q->front->next; *x=p->data; q->front->next=p->next; if(q->rear==p) { q->rear=q->front; } free(p); return TRUE; }
6.完整代码
#include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef struct Node{ ElemType data; struct Node *next; }Node; typedef struct Queue{ struct Node *front,*rear; }Queue; Queue InitQueue();//链队列初始化 int Queue_Empty(Queue Q);//判断队列是否为空 void InQueue(Queue *q);//入队 int OutQueue(Queue *q,ElemType *x);//出队 int main() { ElemType x; Queue Q=InitQueue(); InQueue(&Q); InQueue(&Q); InQueue(&Q); OutQueue(&Q,&x); printf("出队元素:%d ",x); return 0; } Queue InitQueue() { Queue Q; Q.front=Q.rear=(Node*)malloc(sizeof(Node)); Q.front->next=NULL; return Q; } int Queue_Empty(Queue Q) { if(Q.front==Q.rear) return TRUE; else return FALSE; } void InQueue(Queue *q) { ElemType x; printf("输入入队元素:"); scanf("%d",&x); Node *p=(Node*)malloc(sizeof(Node)); p->data=x; p->next=NULL; q->rear->next=p; q->rear=p; } int OutQueue(Queue *q,ElemType *x) { if(Queue_Empty(*q)) { return FALSE; } Node *p=q->front->next; *x=p->data; q->front->next=p->next; if(q->rear==p) { q->rear=q->front; } free(p); return TRUE; }
运行示例: