数据结构(六)循环队列的基本操作 入队 退队

约定不等于承诺〃 2022-08-09 06:46 326阅读 0赞

  
队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。
采用空闲一个位置的方式,即N个元素空间的循环队列最多只能存放N-1个有效元素。这也是大多数教材的做法。

  1. 队列有下面几个操作:

    void init(PQUEUE);//初始化
    void in(PQUEUE);//入队
    void out(PQUEUE,int *);//出队
    void printQueue(PQUEUE);//打印队列
    bool is_empty(PQUEUE);//队列是否为空
    bool is_full(PQUEUE);//队列是否满

1) 循环队列初始化:front=rear=0;
2)入队操作:rear=(rear+1)%size;
3)出队操作:front=(front+1)%size;
4)判断是否为空队列:front==rear;
5)判断队列是否已满:front=(rear+1)%size;
6)遍历队列各元素。

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. //静态队列,循环队列
  4. typedef struct Queue{
  5. int * base;
  6. int front;//队首
  7. int rear;//队尾
  8. int len;//队列长度
  9. }QUEUE,*PQUEUE;
  10. void init(PQUEUE);//初始化
  11. void in(PQUEUE);//入队
  12. void out(PQUEUE,int *);//出队
  13. void printQueue(PQUEUE);//打印队列
  14. bool is_empty(PQUEUE);//队列是否为空
  15. bool is_full(PQUEUE);//队列是否满
  16. int main(void){
  17. QUEUE q;
  18. int val;
  19. init(&q);
  20. in(&q);
  21. in(&q);
  22. in(&q);
  23. printQueue(&q);
  24. out(&q,&val);
  25. printf("出队的元素是:%d\n",val);
  26. printQueue(&q);
  27. return 0;
  28. }
  29. //队列初始化
  30. void init(PQUEUE pQ){
  31. int len;
  32. printf("请输入需要存储几个元素:");
  33. scanf("%d",&len);
  34. pQ->base =(int*)malloc( sizeof(int)*(len+1) );//因为队尾是最后一个元素的下一个元素,所以要加一
  35. if(pQ->base == NULL){
  36. printf("初始化,分配内存失败.");
  37. exit(-1);
  38. }
  39. pQ->front = pQ->rear = 0;
  40. pQ->len = len;
  41. }
  42. //入队,队首总是指向第一个元素,队尾总是指针最后一个有效元素的下一个元素(一般为NULL)
  43. void in(PQUEUE pQ){
  44. if(is_full(pQ)){
  45. printf("该队列已满,不能入队\n");
  46. return;
  47. }
  48. int val;
  49. printf("请输入值:");
  50. scanf("%d",&val);
  51. pQ->base[pQ->rear] = val;
  52. pQ->rear = (pQ->rear+1)%pQ->len;
  53. }
  54. //出队
  55. void out(PQUEUE pQ,int * pVal){
  56. if( is_empty(pQ) ){
  57. printf("该队列为空,不能出错\n");
  58. return;
  59. }
  60. *pVal = pQ->base[pQ->front];
  61. pQ->front = (pQ->front+1)%pQ->len;
  62. }
  63. //打印队列
  64. void printQueue(PQUEUE pQ){
  65. if( is_empty(pQ) ){
  66. printf("该队列为空\n");
  67. return;
  68. }
  69. printf("队列的元素为:");
  70. int t = pQ->front;
  71. while(t != pQ->rear){
  72. printf("%d ",pQ->base[t]);
  73. t = (t+1)%pQ->len;
  74. }
  75. printf("\n");
  76. }
  77. //判断队列是否为空
  78. bool is_empty(PQUEUE pQ){
  79. return pQ->front == pQ->rear;
  80. }
  81. //判断队列是否已满
  82. bool is_full(PQUEUE pQ){
  83. return (pQ->rear+1)%pQ->len == pQ->front;
  84. }

发表评论

表情:
评论列表 (有 0 条评论,326人围观)

还没有评论,来说两句吧...

相关阅读

    相关 基本操作 数据结构

    队列(queue)也是线性表的一种特殊情况,其所有的插入均限定在表的一端进行,而所有的删除则限定在表的另一端进行。允许插入的一端称队尾(rear),允许删除的一端称队头(fro

    相关 数据结构系列-基本操作

    队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的端是队尾,允许删除的端是队头。 所以说队列是一个先进先出的线性表,相应的也有顺序存储和

    相关 循环基本操作

    循环队列设置不同队空与队满条件的解决方案 为了解决顺序队列假溢出的问题,我们采用的方案是少用一个元素空间,此时的指针状态是队尾指针加1才与队头指针重合,于是此时队满的判定