循环队列的各种基本运算

循环队列的各种基本运算

码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创


  欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。下面开始正式内容
  

  队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。维基百科-队列


  为充分利用向量空间,克服”假溢出”现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。百度百科-循环队列

实验环境


  • 语言c/c++
  • 编译器devc++5.11/5.40


实验内容与要求


  1. 初始化循环队列;
  2. 判断循环队列是否为空;
  3. 依次进队元素a,b,c;
  4. 出队一个元素,并输出该元素;
  5. 输出循环队列的长度;
  6. 依次进队元素d,e,f;
  7. 输出循环队列的长度;
  8. 输出出队序列;
  9. 释放队列。


目录


码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创


实验解析

结构说明


  队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。
在此,我们利用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);
}


结果展示


循环队列的各种基本运算结果截图


附录

相关资料

  1. 维基百科-队列
  2. 百度百科-循环队列
  3. 百度百科-取模运算


源代码


码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创

#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);
}

码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创

  • 27
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值