【数据结构】栈与队列基础
2017-10-18 22:02
344 查看
栈(Stack)又称堆栈,简称FILO表,操作的一端称为栈顶(Top),栈有两种存储表示方法:
1、顺序栈
栈在初始化的时,应当预分配stacksize大小的空间。
顺序栈在入栈的时候需要进行栈满判定,如果栈满应当用realloc函数追加存储空间;在出栈时,需要进行判空。
2、链栈
链栈与单链表无异,相当于用头插法只在链表头部进行操作。出栈操作(*e=top->next->data)前需要判空,出栈后删除出栈结点。
P.S. 在计算机科学中将一个直接或间接调用自己的函数称作递归函数,为了保证递归函数的正确执行,系统会设立一个“递归工作站”,作为整个递归函数运行期间的数据存储区。
总结:栈的出入只在头部进行操作。
队列是一种先进先出(FIFO)的线性表,简称FIFO表。
能够插入元素的一端叫作队尾(Rear),允许删除的一端叫做队头(Front),可以想象成银行排队,在队尾排队,队头出队办理业务。
1、链队
链队的队头是由头结点的指针域指示的,头指针始终指向头结点,当尾指针和头指针都指向头结点时为队空。
元素入队时,每次生成一个新结点接到队尾,然后让队尾指针指向新节点即可;元素出队就是将队列的第一个结点(队头)从链表中删除,并获取其相关的数据元素。
2、循环队列
2.1 队列的顺序存储结构
初始化时,front=rear=0;头指针总是指向实际队头元素位置,尾指针总是指向队尾元素的下一个位置;插入元素时尾指针增1,删除队头元素时,头指针增1。容易理解,此队列容易发生“假溢出”。
2.2 循环队列
循环队列是解决队列“假溢出”的一种有效方法。循环队列假想将队列首尾相连,通过指针的循环来实现。若指针p增加1后达到最大空间位置,应将指针设为0,即p=(p+1)%Max_Qsize。
循环队列的判空有两种方法:1、设置布尔变量来区分出入队,从而判断空满。2、少用一个元素的空间:约定入队前,检查(rear+1)&Max_Qsize是否等于头指针,即rear在循环意义上+1是否等于头指针,若相等则为队满(rear所指的空间始终为空)。
P.S.此为本人学习数据结构时对重点内容的一些整理,和对难理解内容的标注和思考笔记,欢迎大家与我沟通交流。
1、顺序栈
typedef struct{ ElemType *stackdata;//指向一维数组的起始地址 int top; //实际上是数组的下标,永远指向已保存元素空间的下一个位置 int stacksize; }SeqStack;//顺序栈类型说明
栈在初始化的时,应当预分配stacksize大小的空间。
顺序栈在入栈的时候需要进行栈满判定,如果栈满应当用realloc函数追加存储空间;在出栈时,需要进行判空。
2、链栈
typedef struct node{ Elemtype data; //存放栈中的数据元素 Struct node *next; //指针域 }StackNode,*Linkstack;
链栈与单链表无异,相当于用头插法只在链表头部进行操作。出栈操作(*e=top->next->data)前需要判空,出栈后删除出栈结点。
P.S. 在计算机科学中将一个直接或间接调用自己的函数称作递归函数,为了保证递归函数的正确执行,系统会设立一个“递归工作站”,作为整个递归函数运行期间的数据存储区。
总结:栈的出入只在头部进行操作。
队列是一种先进先出(FIFO)的线性表,简称FIFO表。
能够插入元素的一端叫作队尾(Rear),允许删除的一端叫做队头(Front),可以想象成银行排队,在队尾排队,队头出队办理业务。
1、链队
链队的队头是由头结点的指针域指示的,头指针始终指向头结点,当尾指针和头指针都指向头结点时为队空。
元素入队时,每次生成一个新结点接到队尾,然后让队尾指针指向新节点即可;元素出队就是将队列的第一个结点(队头)从链表中删除,并获取其相关的数据元素。
2、循环队列
2.1 队列的顺序存储结构
typedef struct{ Elemtype data[Max_Qsize]; // Max_Qsize是实际最大元素个数 int front; //头指针,实际上是数组下标 int rear; //尾指针,实际上是数组下标 }SeqQuene;
初始化时,front=rear=0;头指针总是指向实际队头元素位置,尾指针总是指向队尾元素的下一个位置;插入元素时尾指针增1,删除队头元素时,头指针增1。容易理解,此队列容易发生“假溢出”。
2.2 循环队列
循环队列是解决队列“假溢出”的一种有效方法。循环队列假想将队列首尾相连,通过指针的循环来实现。若指针p增加1后达到最大空间位置,应将指针设为0,即p=(p+1)%Max_Qsize。
循环队列的判空有两种方法:1、设置布尔变量来区分出入队,从而判断空满。2、少用一个元素的空间:约定入队前,检查(rear+1)&Max_Qsize是否等于头指针,即rear在循环意义上+1是否等于头指针,若相等则为队满(rear所指的空间始终为空)。
P.S.此为本人学习数据结构时对重点内容的一些整理,和对难理解内容的标注和思考笔记,欢迎大家与我沟通交流。
相关文章推荐
- 基础数据结构 之 队列(python实现)
- 基础数据结构--背包,队列,栈
- Java基础之集合框架--使用LinkedList模拟堆栈或队列数据结构
- 基础数据结构02:队列
- 基础数据结构 ①(栈|队列|链表)
- 数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串
- 基础数据结构 链表、栈、队列
- Java基础课程学习总结,使用LinkedList简单模拟队列数据结构和堆栈数据结构的实现
- 数据结构复习-基础、线性表、栈、队列、串
- 数据结构基础(5)--队列和循环队列详解--静态方式
- 基础数据结构--队列链表实现
- 一步一步复习数据结构和算法基础-栈和队列(1)
- 野生前端的数据结构基础练习(2)——队列
- 数据结构基础(3)-->队列
- 一步一步复习数据结构和算法基础-栈和队列(2)
- Python实现基础数据结构--队列
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
- 数据结构 学习笔记之:线性表——顺序表、静态链表、动态链表(单链表、双链表、单循环链表、双循环链表,链式栈、链式队列)——基础概念大扫盲!
- 算法与数据结构基础6:C++队列的简单实现
- 一步一步复习数据结构和算法基础-链式队列