• C语言-循环队列的实现


    循环队列

    1.实验目的

    掌握队列的特点(先进先出)及基本操作,如入队、出队等,队列顺序存储结构和循环队列的实现。

    2.实验内容

    创建一个顺序队列,实现数据的入队和出队运算,进而验证队列的先进先出的特性。步骤如下:

    1. 创建入队和出队函数;
    2. 在主函数中输入数据,以“”做结束标志,调用入队和出队函数。

    3.实验工具

    Visual C++

    4.实验代码

    如下:

    //Authors:xiaobei
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define MAXSIZE 6
    #define OK 1
    #define ERROR 0
    
    typedef struct
    {
     char *base;
     int front;
     int rear;
    }SqQueue;
    
    int InitQueue(SqQueue &Q);
    void EnQueue(SqQueue &Q,char e);
    void DeQueue(SqQueue &Q,char &e);
    
    int main()
    {
     int user,i,n;
     char ch,group[MAXSIZE+1];
     SqQueue Q;
     if(InitQueue(Q))
      printf("初始化成功……
    ");
     else
      printf("初始化失败……
    ");
     while(1)
     {
      if(group[0])
      {
       for(i=0;i<MAXSIZE;i++)
        group[i] = '';
      }
      printf("------------
    ");
      printf("1.入队
    2.出队
    0.退出");
      printf("
    ------------");
      printf("
    (请输入你的选择)
    >>>");
      scanf("%d",&user);
      switch(user)
      {
      case 1:{
       printf("rear = %d;front = %d
    ",Q.rear,Q.front);
       printf("(请输入入队元素)
    >>>");
       getchar();       //吸收"
    " 
       gets(group);
       for(i=0;i < MAXSIZE;i++)
       {
        if(group[i]!='')
         EnQueue(Q,group[i]);
        else
         break;
       }
          }break;
      case 2:{
       printf("rear = %d
    front = %d
    ",Q.rear,Q.front);
       printf("(请输入出队个数)
    >>>");
       scanf("%d",&n);
       for(i=0;i<n;i++)
        DeQueue(Q,ch);
          }break;
      case 0:exit(0);
      }
     }
     return 0;
    }
    
    //初始化
    int InitQueue(SqQueue &Q)
    {
     Q.base = (char*)malloc(MAXSIZE*sizeof(char));
     if(!Q.base)
      return ERROR;
     else
     {
      Q.front = 0;
      Q.rear = Q.front;
      return OK;
     }
    }
    
    //进队
    void EnQueue(SqQueue &Q,char e)
    {
     if((Q.rear+1)%MAXSIZE == Q.front)   //此时的队满,并非真的队满,rear与front相差一个单位 
      printf("
    队列已满!
    ");
     else
     {
      Q.base[Q.rear] = e;
      Q.rear = (Q.rear+1)%MAXSIZE;
      printf("rear = %d;front = %d
    ",Q.rear,Q.front);
      printf("
    %c入队成功!
    ",e);
     }
    }
    
    //出队
    void DeQueue(SqQueue &Q,char &e)
    {
     if(Q.front == Q.rear)
      printf("
    队列已空!
    ");
     else
     {
      e = Q.base[Q.front];
      Q.front = (Q.front+1)%MAXSIZE;
      printf("rear = %d;front = %d
    ",Q.rear,Q.front);
      printf("
    %c出队成功!
    ",e);
     }
    }

    5.总结

    1. 队列是“先进后出”。
    2. 队列在队尾进栈,在队头出栈。
    3. 队满的标志是(Q.rear+1)%MAXSIZE == Q.front。
    4. 队列和栈都是有限制的顺序表。
    5. 注意取值与取址的适用情况。
  • 相关阅读:
    EMC、Pure和NetApp推新品,NAS闪存场景在哪里
    Tomcat 开启Gzip压缩
    win10+ubuntu双系统安装方案
    游戏中水的渲染技术系列一
    什么时候用到线程
    高并发和多线程
    angularJS双向绑定和依赖反转
    javascript ES6
    angularJS核心原理
    javascript限定输入textarea输入长度
  • 原文地址:https://www.cnblogs.com/slz99/p/12527747.html
Copyright © 2020-2023  润新知