码迷,mamicode.com
首页 > 其他好文 > 详细

两种常用的队列

时间:2015-08-05 18:18:14      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:

与栈相反,队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端删除元素。

和线性表类似,队列也可以有两种存储表示。

 

用链表表示的队列简称链队列。下面是带头结点的单链队列的实现

技术分享

技术分享
 1 #include <stdio.h>
 2 #include <malloc.h>
 3 
 4 typedef char QElemType;
 5 //单链队列节点 
 6 typedef struct QNode
 7 {
 8     QElemType data;
 9     struct QNode *next;
10 }QNode,*QueuePtr;
11 //单链队列 
12 typedef struct
13 {
14     QueuePtr front;   //队头指针 
15     QueuePtr rear;    //队尾指针 
16 }LinkQueue;
17 
18 //初始化单链队列 
19 void InitQueue(LinkQueue &Q)
20 {
21     Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
22     Q.front->next=NULL;
23 }
24 
25 //销毁单链队列 
26 void DestroyQueue(LinkQueue &Q)
27 {
28     while(Q.front)
29     {
30         Q.rear=Q.front->next;
31         free(Q.front);
32         Q.front=Q.rear;
33     }
34 }
35 
36 //入队列
37 void EnQueue(LinkQueue &Q,QElemType e)
38 {
39     QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
40     p->data=e;
41     p->next=NULL;
42     Q.rear->next=p;
43     Q.rear=p;
44 } 
45 
46 //出队列
47 bool DeQueue(LinkQueue &Q,QElemType &e)
48 {
49     if(Q.front==Q.rear)
50         return false;
51     QueuePtr p=Q.front->next;
52     e=p->data;
53     Q.front->next=p->next;
54     //如果队列只有一个元素 
55     if(p==Q.rear)
56         Q.front=Q.rear;
57     free(p);
58 } 
View Code

 

 

队列的顺序表示一般实现为循环队列。下面是循环队列的实现

技术分享

因为Q.front=Q.rear不能区分队列是空还是满,所以下面采用少用一个元素空间来解决这个问题。

技术分享
 1 #include <stdio.h>
 2 #include <malloc.h>
 3 #define MAXQSIZE 100   //最大队列长度
 4 
 5 typedef char QElemType;
 6 //定义循环队列
 7 typedef struct
 8 {
 9     QElemType *base;   //
10     int front;         //头指针,若队列非空,指向队列头元素 
11     int rear;          //尾指针,若队列非空,指向队列尾元素的下一个位置 
12 }SqQueue;
13 
14 //初始化
15 void InitQueue(SqQueue &Q)
16 {
17     Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
18     Q.front=Q.rear=0;
19 } 
20 
21 //获取队列的长度
22 int QueueLength(SqQueue Q)
23 {
24     return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
25 } 
26 
27 //入队列
28 bool EnQueue(SqQueue &Q,QElemType e)
29 {
30     //判断队列是否已经满了 
31     if((Q.rear+1)%MAXQSIZE==Q.front)
32         return false;
33     Q.base[Q.rear]=e;
34     Q.rear=(Q.rear+1)%MAXQSIZE;
35     return true;
36 } 
37 
38 //出队列
39 bool DeQueue(SqQueue &Q,QElemType &e)
40 {
41     //判断队列是否为空
42     if(Q.rear==Q.front)
43         return false;
44     e=Q.base[Q.front];
45     Q.front=(Q.front+1)%MAXQSIZE;
46     return true; 
47 } 
View Code

 

两种常用的队列

标签:

原文地址:http://www.cnblogs.com/runnyu/p/4705153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!