用顺序表实现一个循环队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用顺序表实现一个循环队列相关的知识,希望对你有一定的参考价值。

  队列是一种先进先出的线性表,简称FIFO。允许插入的一端为队尾,允许出列的一端为队头。

比如一个队列q=(p1,p2,p3,p4...pn),p1就是那个队头,pn就是队尾。出列时总是从p1开始

向后,入列时总是从pn后面插入。就像敲键盘,依次敲qwr,屏幕上显示的就是qwr,先敲的先显

示。

 以下代码是用顺序表实现一个循环队列

  1 /**
  2   * @filename queue.c
  3   * @author   haohaibo  
  4   * @data      2017/4/12
  5   * @brief       用顺序表实现一个循环队列
  6 **/
  7 #include <stdio.h>
  8 #include <stdlib.h>
  9 #define N 9
 10 typedef int datatype_t ;
 11 
 12 typedef    struct{
 13     datatype_t data[N];
 14     int front;
 15     int real;
 16 }seqqueue_t;
 17 
 18 /**
 19   * @brief     输出头指针和尾指针用于调试
 20  */ 
 21 void showpos(seqqueue_t *sq)
 22 {
 23     printf("real=%d\n",sq->real);
 24     printf("front=%d\n",sq->front);
 25 }
 26 
 27 /**
 28   * @brief 创建一个队列
 29  */ 
 30 seqqueue_t *seqqueue_create()
 31 {
 32     seqqueue_t *sq;
 33     sq=(seqqueue_t  *)malloc(sizeof(seqqueue_t));
 34     sq->front=0;
 35     sq->real=0;
 36     return sq;
 37 }
 38 
 39 /**
 40   * @brief 清空队列
 41  */ 
 42 void seqqueue_clear(seqqueue_t *sq)
 43 {
 44     sq->front=0;
 45     sq->real=0;
 46 }
 47 
 48 /**
 49   * @brief 队列满
 50  */ 
 51 int seqqueue_full(seqqueue_t *sq)
 52 {
 53     if((sq->real+1)%N==sq->front)
 54     {
 55         puts("seqqueue full");
 56         return 1;
 57     }
 58         return 0;
 59     
 60 }
 61 
 62 /**
 63   * @brief 队列空
 64  */ 
 65 int seqqueue_empty(seqqueue_t *sq)
 66 {
 67     if(sq->real==sq->front)
 68     {
 69         puts("seqqueue full");
 70         return 1;
 71     }
 72     return 0;
 73 }
 74 
 75 /**
 76   * @brief 插入数据
 77  */
 78 int seqqueue_push(seqqueue_t *sq,datatype_t value)
 79 {
 80     if(seqqueue_full(sq))    
 81     return -1;
 82     //sq->real++;
 83     sq->data[sq->real]=value;
 84     sq->real=(sq->real+1)%N;
 85     return 0;
 86 }
 87 /**
 88   * @brief 数据出列
 89  */
 90 datatype_t seqqueue_pop(seqqueue_t *sq)
 91 {
 92     datatype_t value;
 93     if(seqqueue_empty(sq))
 94     exit(1);
 95     value=sq->data[sq->front];
 96     sq->front=(sq->front+1)%N;
 97     return value;
 98 }
 99 
100 /**
101   * @brief 多次数据出列,忽略返回值,仅做调试用
102  */
103 datatype_t seqqueue_pop_n(seqqueue_t *sq,int n)
104 {
105     printf("queue pop count=%d.\n",n);
106     while(n--)
107     seqqueue_pop(sq);
108     return 0;
109 }
110 
111 /**
112   * @brief 打印队列数据
113  */
114 int seqqueue_show(seqqueue_t *sq)
115 {
116     int i=0;
117     printf("queue data: ");
118     if(sq->real>=sq->front)
119     {
120         for(i=sq->front;i<sq->real;i++)
121         printf("%d ",sq->data[i]);
122     }
123     else
124     {
125         for(i=sq->front;i<N;i++)
126         printf("%d ",sq->data[i]);
127         for(i=0;i<sq->real;i++)
128         printf("%d ",sq->data[i]);
129     }
130     putchar(10);
131 }
132 
133 
134 int main(void)
135 {
136     seqqueue_t *sq1;
137     sq1=seqqueue_create();
138     seqqueue_push(sq1,1);
139     seqqueue_push(sq1,2);
140     seqqueue_push(sq1,3);
141     seqqueue_push(sq1,4);
142     seqqueue_push(sq1,5);
143     seqqueue_push(sq1,6);
144     seqqueue_push(sq1,7);
145     seqqueue_show(sq1);
146     seqqueue_pop_n(sq1,5);
147     seqqueue_show(sq1);
148     seqqueue_push(sq1,1);
149     seqqueue_push(sq1,2);
150     seqqueue_push(sq1,3);
151     seqqueue_push(sq1,4);
152     seqqueue_push(sq1,5);
153     seqqueue_show(sq1);
154     seqqueue_pop_n(sq1,5);
155     seqqueue_show(sq1);
156 }

 

以上是关于用顺序表实现一个循环队列的主要内容,如果未能解决你的问题,请参考以下文章

go语言循环队列的实现

队列:顺序队列和循环队列

队列(循环队列)

622. 设计循环队列

622. 设计循环队列

622. 设计循环队列