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