队列也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。
一、队列的顺序存储形式
一般队列的顺序存储结构运用的是循环队列,在编写程序之前,需要了解循环队列的相关计算。
初始时:Q.front=Q.rear=0
队空条件:Q.front==Q.rear
队满条件:(Q.rear+1)%MaxSize==Q.front
队头指针进1:Q.front=(Q.front+1)%MaxSize
队尾指针进1:Q.rear=(Q.rear+1)%MaxSize
队列长度:(Q.rear-Q.front+MaxSize)%MaxSize
基础代码如下所示:
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct //队列的顺序存储结构
{
int data[MaxSize]; //存放队列元素
int front, rear; //队头指针和队尾指针
}SqQueue;
void Init(SqQueue& Q) //初始化队列
{
Q.front = Q.rear = 0; //是0不是空
}
bool IsEmpty(SqQueue Q) //判队空
{
if (Q.front == Q.rear)
return true;
else
return false;
}
bool Enter(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 Out(SqQueue& Q) //出队
{
if (Q.front == Q.rear) //判断队列是否为空
return false;
int x = Q.data[Q.front];
printf("%4d", x);
Q.front = (Q.front + 1) % MaxSize;
return true;
}
int main() {
SqQueue Q;
Init(Q);
int x=0,i=0;
printf("输入一串数据,以“-99999”结束:");
while (x != -99999) {
scanf_s("%d", &x);
Enter(Q, x);
i++; //i记录队列中数据元素个数
}
printf("\n出队:");
for(int j=0;j<i-1;j++) //队列中的数据依次出队
Out(Q);
}
结果如下:
二、队列的链式存储结构
队列的链式存储结构的主要思想,正是带表头结点的单链表。
与顺序存储不一样的是:
顺序存储中,front指向第一个值,而rear指向最后一个值的后一个位置;
链式存储中,front指向头结点,rear指向最后一个结点。
以下简单地给出队列链式存储的初始化,判队空,进出队的操作。
基础代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode //链式队列结点
{
int data;
struct LinkNode* next;
}LinkNode;
typedef struct //链式队列
{
LinkNode* front, * rear;
}LinkQueue;
void Init(LinkQueue &Q) //队列初始化
{
Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode)); //创建头结点
Q.front->next = NULL;
}
bool IsEmpty(LinkQueue Q) //判队空
{
if (Q.front == Q.rear)
return false;
else
return true;
}
void Enter(LinkQueue& Q,int x) //入队
{
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x; s->next = NULL;
Q.rear->next = s;
Q.rear = s;
}
bool Out(LinkQueue& Q) //出队
{
if (Q.front == Q.rear)
return false;
LinkNode* p = Q.front->next;
int x = p->data;
printf("%4d", x);
Q.front->next = p->next;
if (Q.rear == p) //若队列中只有一个结点,删除后变空
Q.rear = Q.front;
free(p);
return true;
}
int main() {
LinkQueue Q;
Init(Q);
int x=0,i=0;
printf("输入一串数据,以“-99999”结束:");
while (x != -99999) {
scanf_s("%d", &x);
Enter(Q, x);
i++; //i记录队列中数据元素个数
}
printf("\n出队:");
for(int j=0;j<i-1;j++) //队列中的数据依次出队
Out(Q);
}
结果如下: