循环队列的各种基本运算
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。
欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。下面开始正式内容
队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。维基百科-队列
为充分利用向量空间,克服”假溢出”现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。百度百科-循环队列
实验环境
- 语言c/c++
- 编译器devc++5.11/5.40
实验内容与要求
- 初始化循环队列;
- 判断循环队列是否为空;
- 依次进队元素a,b,c;
- 出队一个元素,并输出该元素;
- 输出循环队列的长度;
- 依次进队元素d,e,f;
- 输出循环队列的长度;
- 输出出队序列;
- 释放队列。
目录
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。
实验解析
结构说明
队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。
在此,我们利用C语言的结构体类型定义顺序表:
#define QUEUE_INIT_SIZE 100 // 存储空间初始分配量
#define QUEUE_INCREAMENT 2 // 分配增量
typedef struct{
QElemType *base; //存储数据元素的数组
int front; //头指针,若队列不空,指向队列头元素
int rear; //尾指针,指向队尾元素的下一个位置
int queuesize; //当前分配的存储容量
}SqQueue;
定义说明
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char QElemType;
#define QUEUE_INIT_SIZE 100 // 存储空间初始分配量
#define QUEUE_INCREAMENT 2 // 分配增量
定义常用常量,类型别称
函数说明
循环队列函数
初始化
Status InitQueue(SqQueue &que){
que.base = (QElemType*)malloc( QUEUE_INIT_SIZE*sizeof(QElemType));
if (!que.base )
exit(0);
que.queuesize = QUEUE_INIT_SIZE;
que.rear = 0;
que.front = 0;
return OK;
}
给循环队列分配空间 ,成功返回1,失败则结束程序。 使用循环队列一定要先初始化再使用
判空
Status EmptyQueue (SqQueue que) {
if(que.front == que.rear)
return TRUE;
else
return FALSE;
}//
判断循环队列是否为空,空返回1,不空为0
获取长度
Status GetLength(SqQueue que){
return (que.rear-que.front+que.queuesize)%que.queuesize;//%求模。循环队列循环的核心
}
返回循环队列长度
取模运算(“Modulo Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中。取余则更多是数学概念。模运算在数论和程序设计中都有着广泛的应用,从奇偶数的判别到素数的判别,从模幂运算到最大公约数的求法,从孙子问题到凯撒密码问题,无不充斥着模运算的身影。虽然很多数论教材上对模运算都有一定的介绍,但多数都是以纯理论为主,对于模运算在程序设计中的应用涉及不多。百度百科-取模运算
入队
Status PushQueue(SqQueue &que , QElemType e ){
if((que.rear+1)%que.queuesize!=que.front){
que.rear = ++que.rear%que.queuesize;
que.base[que.rear] = e;
return OK;
}
return ERROR;
}
将元素e存入循环队列,成功返回1,失败返回0
出队
Status OutQueue(SqQueue &que , QElemType &e){
if(que.front == que.rear)
return ERROR;
else{
que.front = (que.front+1)% que.queuesize;
e= que.base[que.front];
return OK;
}
return ERROR;
}
将队尾元素出队存入e,成功返回1,失败返回0
释放
Status DestroyQueue ( SqQueue &que) {
if (!que.base)
return ERROR;
free (que.base);
que.queuesize= 0;
return OK;
}
释放传入的循环队列,成功返回1,失败返回0
主函数
int main(){
SqQueue que;
QElemType e;
printf("1)初始化循环加头队列;\n");
InitQueue(que);
printf("2)判断循环加头队列是否为空;");
printf(EmptyQueue(que)?"ture\n":"flase\n");
printf("3)依次进队元素a,b,c;\n");
PushQueue(que,'a');
PushQueue(que,'b');
PushQueue(que,'c');
printf("4)出队一个元素,并输出该元素;");
OutQueue(que,e);
printf("%c\n",e);
printf("5)输出循环队列的长度;");
printf("%d\n",GetLength(que));
printf("6)依次进队元素d,e,f;\n");
PushQueue(que,'d');
PushQueue(que,'e');
PushQueue(que,'f');
printf("7)输出循环队列的长度;");
printf("%d\n",GetLength(que));
printf("8)输出出队序列;");
while(OutQueue(que,e)==1)
printf("%c",e);
printf("\n");
printf("9)释放队列。");
DestroyQueue(que);
}
结果展示
附录
相关资料
源代码
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。
#include "stdio.h"
#include<malloc.h> //malloc()
#include<process.h> //exit()
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char QElemType;
#define QUEUE_INIT_SIZE 100 // 存储空间初始分配量
#define QUEUE_INCREAMENT 2 // 分配增量
typedef struct{
QElemType *base; //存储数据元素的数组
int front; //头指针,若队列不空,指向队列头元素前一个元素
int rear; //尾指针,指向队尾元素
int queuesize; //当前分配的存储容量
}SqQueue;
Status InitQueue(SqQueue &que){
que.base = (QElemType*)malloc( QUEUE_INIT_SIZE*sizeof(QElemType));
if (!que.base )
exit(0);
que.queuesize = QUEUE_INIT_SIZE;
que.rear = 0;
que.front = 0;
return OK;
}
Status EmptyQueue (SqQueue que) {
if(que.front == que.rear)
return TRUE;
else
return FALSE;
}//
Status PushQueue(SqQueue &que , QElemType e ){
if((que.rear+1)%que.queuesize!=que.front){
que.rear = ++que.rear%que.queuesize;
que.base[que.rear] = e;
return OK;
}
return ERROR;
}
Status OutQueue(SqQueue &que , QElemType &e){
if(que.front == que.rear)
return ERROR;
else{
que.front = (que.front+1)% que.queuesize;
e= que.base[que.front];
return OK;
}
return ERROR;
}
Status GetLength(SqQueue que){
return (que.rear-que.front+que.queuesize)%que.queuesize;
}
Status DestroyQueue ( SqQueue &que) {
if (!que.base)
return ERROR;
free (que.base);
que.queuesize= 0;
return OK;
}
int main(){
SqQueue que;
QElemType e;
printf("1)初始化循环加头队列;\n");
InitQueue(que);
printf("2)判断循环加头队列是否为空;");
printf(EmptyQueue(que)?"ture\n":"flase\n");
printf("3)依次进队元素a,b,c;\n");
PushQueue(que,'a');
PushQueue(que,'b');
PushQueue(que,'c');
printf("4)出队一个元素,并输出该元素;");
OutQueue(que,e);
printf("%c\n",e);
printf("5)输出循环队列的长度;");
printf("%d\n",GetLength(que));
printf("6)依次进队元素d,e,f;\n");
PushQueue(que,'d');
PushQueue(que,'e');
PushQueue(que,'f');
printf("7)输出循环队列的长度;");
printf("%d\n",GetLength(que));
printf("8)输出出队序列;");
while(OutQueue(que,e)==1)
printf("%c",e);
printf("\n");
printf("9)释放队列。");
DestroyQueue(que);
}
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。