实现环形队列的各种基本运算的算法
一、实验内容
编写一个程序,实现环形队列(假设栈中的元素类型 ElemType为char)的各种基本运算,并在此基础上设计一个程序完成以下功能。
(1)初始化队列q。
(2)判断队列g是否非空。
(3)依次进队元素a、b、c。
(4)出队一个元素,输出该元素。
(5)依次进队元素d、e、f。
(6)输出出队序列。
(7)释放队列。
二、实验目的
本实验旨在通过编写一个程序实现环形队列的基本操作,包括初始化、判断队列是否非空、进队、出队、输出出队序列以及释放队列,以加深对环形队列数据结构的理解和掌握。
三、设计方案
- 定义环形队列结构体
首先需要定义环形队列的结构体,包括一个头指针front和一个尾指针rear,以及一个数组或链表用于存储队列元素。同时还需要定义队列的容量和当前队列中的元素数量。 - 初始化队列
初始化队列可以通过将头指针和尾指针都置为NULL,并将队列容量和元素数量都置为0来实现。 - 判断队列是否非空
判断队列是否非空可以通过判断头指针和尾指针是否相等来实现。如果头指针和尾指针相等,则队列为空;否则,队列非空。 - 依次进队元素a、b、c
进队操作可以通过在尾指针处创建新节点并将其插入到链表的尾部来实现。具体步骤如下:
a. 创建新节点并设置其数据为需要进队的元素。
b. 将rear指针指向新节点。
c. 如果队列已满,则将front指针指向新节点;否则,将front指针指向下一个节点。
重复以上步骤,直到所有元素都进队。 - 出队一个元素,输出该元素
出队操作可以通过遍历链表并输出当前节点的数据来实现。具体步骤如下:
a. 将front指针指向下一个节点。
b. 输出front指向的节点的数据。
重复以上步骤,直到队列为空。 - 依次进队元素d、e、f
同上,进队操作可以通过在尾指针处创建新节点并将其插入到链表的尾部来实现。重复步骤4中的步骤a和步骤b,直到所有元素都进队。 - 输出出队序列
输出出队序列可以通过遍历链表并输出每个节点的数据来实现。具体步骤如下:
a. 将front指针指向下一个节点。
b. 输出front指向的节点的数据。
重复以上步骤,直到队列为空。 - 释放队列
最后需要释放整个链表所占用的内存空间,包括每个节点的内存以及头指针和尾指针所指向的内存空间。
四、代码实现
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct {
char data[MaxSize];
int front,rear;
}SqQueue;
//初始化队列
void InitQueue(SqQueue *&q){
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=-1;
}
//销毁队列
void DestroyQueue(SqQueue *&q){
free(q);
}
//判断队列空
bool QueueEmpty(SqQueue *q){
return(q->front==q->rear);
}
//进队列
bool enQueue(SqQueue *&q,char e){
if((q->rear+1)%MaxSize==q->front)return false;
q->rear=(q->rear+1)%MaxSize;
q->data[q->rear]=e;
return true;
}
//出队列
bool deQueue(SqQueue *&q,char &e){
if(q->rear==q->front) return false;
q->front=(q->front+1)%MaxSize;
e=q->data[q->front];
return true;
}
int main(){
SqQueue *s;
char e;
//1初始化队列
InitQueue(s);
printf("1、初始化队列:完成!\n");
//2判断队列是否为空
printf("2、判断队列是否为空:");
QueueEmpty(s);
if(QueueEmpty(s))printf("队列为空!\n");
else printf("队列非空!\n");
//3依次进队列元素a、b、c、d、e
printf("3、依次进队列元素a、b、c、d、e:");
char a[5]={'a','b','c','d','e'};
for(int i=0;i<5;i++){
enQueue(s,a[i]);
printf("%c\t",a[i]);
}
printf("\n");
//4判断队列是否为空
printf("4、判断队列是否为空:");
QueueEmpty(s);
if(QueueEmpty(s))printf("队列为空!\n");
else printf("队列非空!\n");
//5输出出队列序列
printf("5、输出出队列序列:");
while(s->rear!=s->front){
deQueue(s,e);
printf("%c\t",e);
}
printf("\n");
//6判断栈是否为空
printf("5、判断队列是否为空:");
QueueEmpty(s);
if(QueueEmpty(s))printf("队列为空!\n");
else printf("队列非空!\n");
//7释放栈
printf("7、释放队列:完成!");
DestroyQueue(s);
return 0;
}
五、运行结果