数据结构——c语言描述 第三章(3) 队列
来源:互联网 发布:java 当前时间转整型 编辑:程序博客网 时间:2024/06/06 03:48
队列其实也是一种限定性线性表,它其实和栈在某种程度上是很有相似性的,但是它和栈的最重要的一个区别就是栈的性质是先进后出,但是队列的基本性质是先进先出,这和人们生活中的排队的队列是很相似的。
下面写出链栈的基本实现,其实这种简单的数据结构概念上还是比较容易理解的。
#define TRUE 1#define FALSE 0typedef char Ele_type;typedef struct Node { Ele_type data; struct Node *next;}LinkQueueNode;typedef struct Queue { LinkQueueNode *rear; LinkQueueNode *front;}LinkQueue;int InitQueue (LinkQueue *Q) { if (Q == NULL) return FALSE; Q->front = (LinkQueueNode *) malloc (sizeof (LinkQueueNode)); if (Q->front != NULL) { Q->rear = Q->front; Q->rear->next = NULL; return TRUE; }else return FALSE;}int EnterQueue (LinkQueue *Q , Ele_type c) { LinkQueueNode *temp = (LinkQueueNode *) malloc (sizeof (LinkQueueNode)); if (Q == NULL) return FALSE; if (temp != NULL) { temp->data = c; Q->rear->next = temp; temp->next = NULL; Q->rear = temp; return TRUE; }else return FALSE;}int DelQueue (LinkQueue *Q , Ele_type *c) { if (Q == NULL || c == NULL) return FALSE; LinkQueueNode *temp = Q->front->next; *c = temp->data; if (temp == Q->rear) { Q->rear = Q->front; Q->front = NULL; }else Q->front->next = temp->next; free (temp); return TRUE;}这个实现包括进队,出队和初始化队列。虽然非常简单,但是这里还有有几点需要注意的。第一点是这里对基本的队列节点进行了二次抽象化,抽象出来一个LinkQueue的数据结构,这个数据结构对应的是队列的头节点和尾节点,这里抓住了最重要的部分就是,抽象化出进队列和出队列的操作。第二个需要注意的地方就是,在这里使用了两个指针指向了一个链表的头节点和尾节点,这里在实现出队列的操作时,当本来队列中只有一个元素的时候,要主要对尾节点的处理,不然会出现问题。当然这里还可以对其他链表的形式有启示,在以后的编程的过程需要注意的!
————————————————————————————————————————分割线 2016.6.27凌晨
第二个部分就是循环队列,书上给出了牺牲一个数组元素的算法实现了循环数组,我在这里就不赘述,作者说可以有不用牺牲数组元素就可以完成的算法,使用一个标志tag实现,但在这里我个人的愚见,这里不如使用一个计数器count,每次进队列的时候加一,每次出队列的时候减一,当值为0的时候,就可以认为是空队列,当值等于MAXSIZE的时候就可以认为是空队列,不仅让算法简化,而且空间利用率也提升,当然这只是我的个人的见解。下面上代码。
#define MAXSIZE 10#define TRUE 1#define FALSE 0typedef int EleType;typedef struct node { EleType data_arr[MAXSIZE]; int front; int rear; int count;}SeqQueue;void InitSeqQueue (SeqQueue *Q) { Q->front = Q->rear = 0; Q->count = 0;}int EnterQueue (SeqQueue *Q , EleType c) { if (Q->count == MAXSIZE) return FALSE; // the queue is full Q->data_arr[Q->rear] = c; Q->rear = (Q->rear+1)%MAXSIZE; Q->count++; return TRUE;}int DelQueue (SeqQueue *Q , EleType *c) { if (Q->count == 0) return FALSE; *c = Q->data_arr[Q->front]; Q->front = (Q->front+1) % MAXSIZE; Q->count--; return TRUE;}
——————————————————————————————————————分割线2016.6.28凌晨
0 0
- 数据结构——c语言描述 第三章(3) 队列
- 数据结构——c语言描述 第三章 (2)栈的练习(四则运算的实现)
- 数据结构——c语言描述 第三章(1) 栈的概念和栈的基本实现
- 数据结构(C语言描述)读书笔记之队列
- 数据结构与算法C语言描述 第三章练习
- 数据结构C语言描述———用顺序队列判断回文数
- 数据结构——c语言描述 第二章(3) 双向链表
- 数据结构——c语言描述 第五章(3)十字链表存储稀疏矩阵
- 数据结构(C语言描述)—排序
- 数据结构——c语言描述 第四章 字符串
- 数据结构与算法(C语言描述)——单链表
- 数据结构—单链表(类C语言描述)
- 数据结构(C语言描述)
- 队列 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 优先队列(堆) - C语言实现(摘自数据结构与算法分析 C语言描述)
- 优先队列(堆) - C语言实现(摘自数据结构与算法分析 C语言描述)
- 队列 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 队列 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 使用Hibernate注解来配置多对一单向的三种方法
- 【深入理解Java虚拟机】类加载机制
- [代码实例][gtk+]画布
- [0.0.0] 大型spark项目实战
- 同步模块模式
- 数据结构——c语言描述 第三章(3) 队列
- Maven构建项目的灵活性
- logcat命令小结
- 背景减除法的研究
- Develop -- Training(十五) -- 显示高效位图
- reactjs学习笔记2--组件的介绍
- 详解AndroidStudio中使用GsonFormat(附图)
- 深拷贝和浅拷贝
- 安卓学习之-ActivityManager