队列ADT
2018-01-29 21:40
1031 查看
队列ADT
FIFO (先进先出)typedef struct queueCDT * queueADT;
入队:
出队:
循环队列:
只凭front与rear是否相等,无法判断队列是满还是空。
1、增加标志位:当数据入队列后,出现front与rear相等,设置标志位。
2、少用一个存储单元:当front在rear的下一位置即表示队列已满
求取元素个数:
只需要将队尾值rear减去队头值front即可,得到的差值即表示元素个数。
若差值为负数,只需要加上存储空间的大小。
顺序队列的实现:
5 typedef int queueElementT;
6 typedef struct queueCDT * queueADT;
4 #define MAXQSIZE 100 5 struct queueCDT{ 6 queueElementT *data; 7 int front; 8 int rear; 9 };
初始化队列:
1 queueADT newQueue(void) 12 { 13 queueADT queue; 14 queue = (queueADT)malloc(sizeof(struct queueCDT)); 15 queue -> data = (queueElementT*)malloc(MAXQSIZE * sizeof(queueElementT)); 16 queue -> front = 0; 17 queue -> rear = 0; 18 return queue; 19 }
入队,出队:
27 bool inQueue(queueADT queue, queueElementT value) 28 { 29 if(queueIsFull(queue)) { 30 return false; 31 } 32 queue -> data[queue -> rear] = value; 33 queue -> rear = (queue->rear + 1) % MAXQSIZE; 34 return true; 35 } 37 bool outQueue(queueADT queue, queueElementT *p_value) 38 { 39 if(queueIsEmpty(queue)) { 40 return false; 41 } 42 *p_value = queue -> data[queue -> front]; 43 queue -> front = (queue -> front + 1) % MAXQSIZE; 44 return true; 45 }
判空,判满:
47 bool queueIsEmpty(queueADT queue) 48 { 49 return (queue -> rear == queue -> front); 50 } 52 bool queueIsFull(queueADT queue) 53 { 54 return ((queue->rear + 1) % MAXQSIZE == queue -> front); 55 }
求长度
57 size_t getQueueLength(queueADT queue) 58 { 59 return (queue -> rear – queue -> front + MAXQSIZE) % MAXQSIZE; 60 }
链队列:
定义队列结构体:struct queueCDT{ slist_head_t list_head; /* 链表头 */ };
链表结点类型:
typedef struct _queue_node_t{ slist_node_t node; int data; } queue_node_t
15 queueADT newQueue(void) 16 { 17 queueADT queue; 18 queue = (queueADT)malloc(sizeof(struct queueCDT)); 19 slist_init(&queue -> list_head); 20 return queue; 21 } 33 bool inQueue(queueADT queue, queueElementT value) 34 { 35 if(queueIsFull(queue)) { 4000 36 return false; 37 } 38 queue_node_t *p_node = (queue_node_t *)malloc(sizeof(queue_node_t)); 39 p_node -> data = value; 40 slist_add_tail(&queue -> list_head, &(p_node -> node)); 41 return true; 42 } 56 bool queueIsEmpty(queueADT queue) 57 { 58 return (slist_begin_get(&queue -> list_head) == slist_end_get(&queue -> list_head)); 59 } 67 static int _numElems_node(void *p_arg, slist_node_t *p_node) 68 { 69 (*(size_t *)p_arg)++; 70 return 0; 71 }
在入队列函数的实现中,每次都需要将新的结点添加至链表尾部,而对于单向链表,直接将结点添加至链表尾部的效率是非常低的,每次都需要从头开始遍历,直到找到最后一个结点,才能执行 实际的添加操作。解决:双向链表
相关文章推荐
- 队列的抽象数据类型(abstract data type,ADT)
- ADT - 链式队列(LinkQueue)
- 数据结构(三)之队列ADT
- 3.2 表、栈和队列_表ADT
- 队列ADT
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 4000 队列
- 数据结构-->(循环)队列 【队列的顺序实现】ADT
- C_栈和队列(ADT)-队列的链式表示和实现
- 队列的抽象数据类型ADT
- 队列ADT实现
- 数据结构与算法 -- 队列 ADT
- HDOJ 1053 Huffman编码 自写优先队列的ADT 权当做练习数据结构
- 3.2 表、栈和队列_栈ADT
- ADT - 顺序队列(Squencial Queue)
- 利用无序数组实现优先队列并排序数组——ADT实现
- 队列ADT
- C Primer Plus学习 六十一 队列 ADT(一)
- 3.4 表、栈和队列_队列ADT
- 以循环顺序表实现的队列ADT(C语言版)
- python数据结构学习笔记-2016-11-05-01-队列ADT及其实现