一、队列
为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。
循环队列和普通队列有所不同,需要注意的是队空队满
为了区分队空还是队满的情况,有多种处理方式(这里选的是第一种):
方式1: 牺牲一个单元来区分队空和队满,入队时少用一个队列单元,即约定以"队头指针在队尾指针的下一位置作为队满的标志"
方式2: 增设表示队列元素个数的数据成员size,此时,队空和队满时都有front==rear。
方式3: 增设tag数据成员以区分队满还是队空
二、代码
1.头文件与宏定义
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAXSIZE 50
#define QueueElemType char
2.循环队列的定义及主要操作
typedef struct {
QueueElemType elem[MAXSIZE];
int front; //头
int rear; //尾
}SeqQueue;
// 初始化
void InitQueue(SeqQueue* Q) {
Q->front = Q->rear = 0;
}
// 判断队列是否为空
int IsEmpty(SeqQueue Q) {
if (Q.front == Q.rear) {
return TRUE;
}
else {
return FALSE;
}
}
// 入队
int EnterQueue(SeqQueue* Q, QueueElemType x) {
if ((Q->rear + 1) % MAXSIZE == Q->front) {
//队列已满
return FALSE;
}
else {
Q->elem[Q->rear] = x;
Q->rear = (Q->rear + 1) % MAXSIZE; //重新设置队尾
return TRUE;
}
}
// 出队
int DeleteQueue(SeqQueue* Q, QueueElemType* x) {
if (Q->front == Q->rear) {
//队列为空
return FALSE;
}
else {
*x = Q->elem[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return TRUE;
}
}
// 求队的长度
int LenQueue(SeqQueue Q) {
return ((Q.rear + MAXSIZE - Q.front) % MAXSIZE);
}
// 输出队中元素
int PrintQueue(SeqQueue Q) {
if (Q.front == Q.rear) {
//队列为空
return FALSE;
}
while(TRUE) {
if (Q.rear == Q.front) {
return TRUE;
}
else {
printf("%c ", Q.elem[Q.front++]);
}
}
}
3.主函数(测试函数)
int main() {
SeqQueue Q;
int i, n, flag, len;
QueueElemType x;
//初始化循环队列
InitQueue(&Q);
//判断队列是否为空
printf("当前队列是否为空: ");
flag = IsEmpty(Q);
if (flag) {
printf(" 当前队列为空。\n");
}
else {
printf(" 当前队列不为空。\n");
}
//入队
printf("请输入入队数量:\n");
scanf("%d", &n);
getchar();
printf("请输入元素:\n");
for (i = 0; i < n; i++) {
x = getchar();
getchar();
flag = EnterQueue(&Q, x);
if (!flag) {
printf("当前队列已满!!\n");
break;
}
}
//出队
printf("出对一个元素并输出\n");
flag = DeleteQueue(&Q, &x);
if (flag) {
printf("%c \n", x);
}
else {
printf("队列为空!!!\n");
}
//当前队列元素的个数
len = LenQueue(Q);
printf("当前队列元素的个数:%d\n", len);
//入队
printf("请输入入队数量:\n");
scanf("%d", &n);
getchar();
printf("请输入元素:\n");
for (i = 0; i < n; i++) {
x = getchar();
getchar();
flag = EnterQueue(&Q, x);
if (!flag) {
printf("当前队列已满!!\n");
break;
}
}
//当前队列元素的个数
len = LenQueue(Q);
printf("当前队列元素的个数:%d\n", len);
//所有元素出队
printf("所有元素出队:\n");
while (TRUE){
flag = DeleteQueue(&Q, &x);
if (!flag) {
break;
}
else {
printf("%c ", x);
}
}
printf("\n");
//判断队列是否为空
printf("当前队列是否为空: ");
flag = IsEmpty(Q);
if (flag) {
printf(" 当前队列为空。\n");
}
else {
printf(" 当前队列不为空。\n");
}
return 0;
}