暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据结构(严蔚敏C语言版)——队列(循环队列)

编程Cookbook 2020-03-14
2

点击上方蓝字关注我!

如果有错误或者理解不到位的地方还请各位指正!

数据结构的相关问题,可以参考笔者写的系列数据结构文章,或者加我交流!

声明:以下内容是对清华大学出版社出版,由严蔚敏和吴伟民编著的图书《数据结构》(C语言版)的代码实现。
图书PDF版本可移步公众号【李歘歘】回复电子书领取。
《数据结构》(C语言版)是各大高校计算机有关专业的指定教材,还是计算机考研的统考专业课数据结构指定的参考书籍,数据结构作为408专业课的重中之重,值得大家重视。

上次说到了队列的顺序队列,今天我们来说一下有关队列的循环队列,相关知识点可以先了解一下。


书中位置(页码):P63-P65

函数定义及说明:

    Status InitQueue(SqQueue &Q)  //初始化
    int QueueLength(SqQueue Q)  //返回队列长度
    Status EnQueue(SqQueue &Q,QElemType e)  //入队 
    Status DeQueue(SqQueue &Q,QElemType e)  //出队
    Status QueueTraverse(SqQueue Q)  //遍历
    void CrQueue(SqQueue &Q,int n)  //创建栈,就是重复的将元素入栈(当然也可以单独写一个创建的函数)
    Status QueueEmpty(SqQueue Q)  //判空
    Status GetHead(SqQueue Q,QElemType e)  //获取队头元素
    Status ClearQueue(SqQueue &Q)  //置空
    Status DestoryQueue(SqQueue &Q)  //销毁

    程序代码:

      #include<cstdio>
      #include<cstdlib>
      #define QElemType int
      #define Status int
      #define MAXQSIZE 100 //最大队列长度

      using namespace std;
      /**
      说明:
      下面对MAXQSIZE取模的作用是将尾指针和头指针连接起来,
      */

      //队列的结构
      typedef struct {
      QElemType *base; //初始化的动态分配存储空间
      int front; //头指针,若队列不空,指向队列头元素
      int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置
      }SqQueue;

      //初始化
      Status InitQueue(SqQueue &Q){
      Q.base = (QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
      if(!Q.base){
      printf("内存分配失败\n");
      return 0;
      }
      Q.front = Q.rear = 0;
      return 0;
      }

      //返回队列长度
      int QueueLength(SqQueue Q){
      printf("链表长度为%d\n",(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE);
      return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
      }

      //入队
      Status EnQueue(SqQueue &Q,QElemType e){
      if((Q.rear+1)%MAXQSIZE == Q.front){
      printf("队列已满\n");
      return 0;
      }
      Q.base[Q.rear] = e;
      Q.rear = (Q.rear + 1) % MAXQSIZE; //尾指针加1,当到达尾部时,循环到头指针,返回头指针
      return 0;
      }

      //出队
      Status DeQueue(SqQueue &Q,QElemType e){
      //判空
      if(Q.front == Q.rear){
      printf("队列为空\n");
      return 0;
      }
      e = Q.base[Q.front];
      Q.front = (Q.front + 1) % MAXQSIZE; //头加1,当到达头时,循环到尾指针,返回尾指针
      printf("元素%d出队\n",e);
      return 0;
      }

      //遍历
      Status QueueTraverse(SqQueue Q){
      printf("遍历开始:");
      for(int i=Q.front;i<Q.rear;i++){
      printf("%d ",Q.base[i]);
      }
      printf("\n");
      return 0;
      }


      //创建栈,就是重复的将元素入栈(当然也可以单独写一个创建的函数)
      void CrQueue(SqQueue &Q,int n){
      InitQueue(Q);
      for(int i=0;i<n;i++){
      int e;
      scanf("%d",&e);
      EnQueue(Q,e);
      }
      printf("创建成功\n");
      }

      //判空
      Status QueueEmpty(SqQueue Q){
      if(Q.front == Q.rear){
      printf("队列为空\n");
      return true;
      }else{
      printf("队列不为空\n");
      return false;
      }
      }

      //获取队头元素
      Status GetHead(SqQueue Q,QElemType e){
      if(Q.front == Q.rear){
      printf("队列为空\n");
      return 0;
      }
      e = Q.base[Q.front]; //队头元素之前有一个空的头结点
      printf("队头元素为:%d\n",e);
      return 0;
      }

      //置空
      Status ClearQueue(SqQueue &Q){
      Q.rear = Q.front;
      printf("置空操作成功\n");
      return 0;
      }

      //销毁
      Status DestoryQueue(SqQueue &Q){
      free(Q.base); //销毁连续空间
      Q.front = 0; //栈底指针赋空
      Q.rear = 0; //栈顶指针赋空
      printf("销毁成功");
      return 0;
      }
      int main(){
      int n;
      QElemType value1,value2;
      SqQueue Q;
      printf("请输入队列元素个数:");
      scanf("%d",&n);
      CrQueue(Q,n);
      GetHead(Q,value1);
      DeQueue(Q,value2);
      QueueTraverse(Q);
      ClearQueue(Q);
      QueueTraverse(Q);
      DestoryQueue(Q);
      return 0;

      运行结果:

      「往  •  期  •  精  •  选」

          

      程序员自学攻略——分享珍藏多年的学习网站

      在B站,我看到了不同的技术人生

      原谅我,是我不配!!!

      技术分享的优势——写文章半年的收获

      考研VS就业——选一条适合自己的路

      这些经典排序,你必须掌握
      最短路径——Dijkstra算法这一篇就够了

      全源最短路径问题——Floyd算法

      在看点这里
      文章转载自编程Cookbook,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论