一. 队列
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 structQueue{
ElemType data[MaxSize];intfront,rear,size;
}Queue;
2.初始化队列
Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=Q.size=0;returnQ;
}
3.判断队列是否为空
intQueue_Empty(Queue Q)
{if(Q.front==Q.rear&&Q.size==0)returnTRUE;else
returnFALSE;
}
4.判断队列是否为满
intQueue_Full(Queue Q)
{if(Q.front==Q.rear&&Q.size==MaxSize)returnTRUE;else
returnFALSE;
}
5.入队
int InQueue(Queue *q)
{if(Queue_Full(*q))returnFALSE;
ElemType x;
printf("输入入队元素:");
scanf("%d",&x);
q->data[q->rear]=x;
q->rear=(q->rear+1)%MaxSize;
q->size++;returnTRUE;
}
6.出队
int OutQueue(Queue *q,ElemType *x)
{if(Queue_Empty(*q))returnFALSE;*x=q->data[q->front];
q->front=(q->front+1)%MaxSize;
q->size--;returnTRUE;
}
7.完整代码
#include #include
#define TRUE 1
#define FALSE 0
#define MaxSize 10typedefintElemType;
typedefstructQueue{
ElemType data[MaxSize];intfront,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);//出队,并记录出队元素
intmain()
{
ElemType x;
Queue Q=InitQueue();
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
printf("此时队列长度:%d\n",Q.size);return 0;
}
Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=Q.size=0;returnQ;
}intQueue_Empty(Queue Q)
{if(Q.front==Q.rear&&Q.size==0)returnTRUE;else
returnFALSE;
}intQueue_Full(Queue Q)
{if(Q.front==Q.rear&&Q.size==MaxSize)returnTRUE;else
returnFALSE;
}int InQueue(Queue *q)
{if(Queue_Full(*q))returnFALSE;
ElemType x;
printf("输入入队元素:");
scanf("%d",&x);
q->data[q->rear]=x;
q->rear=(q->rear+1)%MaxSize;
q->size++;returnTRUE;
}int OutQueue(Queue *q,ElemType *x)
{if(Queue_Empty(*q))returnFALSE;*x=q->data[q->front];
q->front=(q->front+1)%MaxSize;
q->size--;returnTRUE;
}
View Code
运行示例:
三. 队列的链式存储
链队列:同时带有队头指针和队尾指针的单链表。
1.结构描述
typedef structNode{
ElemType data;struct Node *next;
}Node;
typedefstructQueue{struct Node *front,*rear;
}Queue;
2.链队列初始化
Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=(Node*)malloc(sizeof(Node));
Q.front->next=NULL;returnQ;
}
3.判断队列是否为空
intQueue_Empty(Queue Q)
{if(Q.front==Q.rear)returnTRUE;else
returnFALSE;
}
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))
{returnFALSE;
}
Node*p=q->front->next;*x=p->data;
q->front->next=p->next;if(q->rear==p)
{
q->rear=q->front;
}free(p);returnTRUE;
}
6.完整代码
#include #include
#define TRUE 1
#define FALSE 0typedefintElemType;
typedefstructNode{
ElemType data;struct Node *next;
}Node;
typedefstructQueue{struct Node *front,*rear;
}Queue;
Queue InitQueue();//链队列初始化
int Queue_Empty(Queue Q);//判断队列是否为空
void InQueue(Queue *q);//入队
int OutQueue(Queue *q,ElemType *x);//出队
intmain()
{
ElemType x;
Queue Q=InitQueue();
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
OutQueue(&Q,&x);
printf("出队元素:%d\n",x);return 0;
}
Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=(Node*)malloc(sizeof(Node));
Q.front->next=NULL;returnQ;
}intQueue_Empty(Queue Q)
{if(Q.front==Q.rear)returnTRUE;else
returnFALSE;
}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))
{returnFALSE;
}
Node*p=q->front->next;*x=p->data;
q->front->next=p->next;if(q->rear==p)
{
q->rear=q->front;
}free(p);returnTRUE;
}
View Code
运行示例:
本帖子中包含资源
您需要 登录 才可以下载,没有帐号?立即注册