数据结构 | 循环队列(基本操作及图示)
2018-06-18 04:03:48来源:未知 阅读 ()
————————————————————————————————————————————
如果使用顺序表作为队列的话,当处于右图状态则不能继续插入新的队尾元素,否则会因为数组越界而导致程序代码被破坏。
由此产生了由链表实现的循环队列,只有队列未满时才可以插入新的队尾元素。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
基本操作:
/* 定义链表队列 */
定义结构体中front指示队头位置,rear指示队尾位置,base指针用于申请空间并存放数据。
/* 初始化队列 */
使用指针*base申请100个内存空间,front和rear分别为0,此时队列为空
/* 判断空或满 */
-
初始化时,front = rear = 0 时为空,Q->rear = (0+1)%100 = 1,队列未满可以插入队列
-
入队3个元素时,rear = 3,Q->rear = (3+1)%100 = 4,队列未满
-
入队99个元素时,rear = 99,Q->rear = (99+1)%100 = 0,队列满,不可入队
-
出队2个元素时,front = 2
出队后,执行两次 Q->front = (Q->front + 1) % MAXQSIZE,得到Q->front = 2
-
再次入队1个元素时,rear = 0,Q->rear = (99+1)%100=0,队列未满,可以入队
实现代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define OK 1 4 #define ERROR 0 5 #define OVERFLOW -2 6 #define MAXQSIZE 100 7 typedef int Status; 8 typedef int QElemType; 9 typedef struct Node 10 { 11 QElemType *base; //初始化动态分配存储空间 12 int front; 13 int rear; 14 } SqQueue; 15 Status InitQueue(SqQueue *Q) 16 { 17 Q->base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType)); 18 if (!Q->base) 19 exit(OVERFLOW); 20 Q->front = Q->rear = 0; 21 return OK; 22 } 23 Status EnQueue(SqQueue *Q, QElemType elem) 24 { 25 //队列为空时 1%100==1,队列满时(99+1)%100==0,最多容纳99个元素 26 if ((Q->rear + 1) % MAXQSIZE == (Q->front)) 27 return ERROR; 28 Q->base[Q->rear] = elem; 29 Q->rear = (Q->rear + 1) % MAXQSIZE; //rear始终在0-100中循环 30 return OK; 31 } 32 Status OutQueue(SqQueue *Q, QElemType *e) 33 { 34 if (Q->front == Q->rear) 35 return ERROR; 36 *e = Q->base[Q->front]; 37 Q->front = (Q->front + 1) % MAXQSIZE; 38 return OK; 39 } 40 Status PrintQueue(SqQueue Q) 41 { 42 printf("the queue is:"); 43 for (int i = Q.front; i < Q.rear; ++i) 44 printf("%d ", Q.base[i]); 45 return OK; 46 } 47 int main() 48 { 49 SqQueue queue; 50 QElemType elem; 51 int i; 52 InitQueue(&queue); 53 printf("input:"); 54 while(scanf("%d", &elem) != EOF) 55 EnQueue(&queue, elem); 56 PrintQueue(queue); 57 /* 输入要出队列的个数 */ 58 printf("\noutput:"); 59 scanf("%d", &i); 60 while(i != 0) 61 { 62 OutQueue(&queue, &elem); 63 i--; 64 } 65 PrintQueue(queue); 66 return OK; 67 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:C 隐式类型转换
下一篇:51单片机定时器简单示例
- 数据结构—链表 2020-05-29
- 单调队列模板【附例题】 2020-05-05
- 图 2020-05-02
- 【数据结构】树套树——线段树套平衡树 2020-04-18
- STL之queue 2020-04-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash