前言
- 栈和队列是两种常用的、重要的数据结构。
- 栈和队列是限定插入和删除只能在表的“端点”进行的线性表。
普通线性表的插入和删除
一、栈的定义和特点
1. 栈的特点
- 栈是一个特殊的线性表,是限定仅在一端(通常是表尾)进行插入和删除操作的线性表。
- 又称为后进先出(Last In First Out)的线性表,简称 LIFO 结构。
- 添加元素是从栈顶一个一个像码垛一样天加上去的,称为压栈操作。
- 想要出栈把1挪出去,只能从栈顶开始,一个一个的挪出去,直到把1挪走。
- 栈特点:先进后出,后进先出。
2. 栈的相关概念
- 栈是仅在表尾进行插入、删除操作的线性表。
- 表尾(即an端)称为栈顶 Top;表头(即a1端)称为栈底 Base。
- 插入元素到栈顶(即表尾)的操作,称为入栈。
- 从栈顶(即表尾)删除最后一个元素的操作,称为出栈。
栈的示意图
入栈的操作示图
出栈的操作示图
举个例子
- 假设有3个元素 a,b,c,入栈顺序是a,b,c,则他们的出栈顺序有几种可能?
- a,b,c,依次先全部入栈,那么出栈顺序自然就是c,b,a。
- a 入栈然后 a 出栈,b 入栈然后 b 出栈,c 入栈然后 c 出栈,出栈顺序就是 a,b,c 了。
- a 入栈然后 a 出栈,b、c依次入栈然后 c、b 依次出栈,出栈顺序就是 a,c,b 了。
- a、b依次入栈然后 b、a 依次出栈,最后c入栈出栈,出栈顺序为 b,a,c。
- a、b依次入栈,然后 b 出栈,c 入栈,然后 c、a 依次出栈,出栈顺序为 b,c,a。
思考:出栈顺序有可能出现cab的情况吗?
- 如果想让c先出栈,又要按照abc的入栈顺序。
- 也就是说,如果c已经入栈的话,那么ab肯定也入栈了,想得到a的话必须先让b出栈,那么cab的出栈顺序就是不能能的。
栈的相关概念
- 定义:限定只能在表的一端进行插入和删除运算的线性表(只能在栈顶操作)。
- 逻辑结构:同线性表相同,仍为一对一的关系。
- 存储结构:用顺序栈或链栈存储均可,但以顺序栈存储更常见。
- 运算规则:只能在栈顶运算,且访问结点时依照后进先出(LIFO)的原则。
- 实现方式:关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同。
栈与一般线性表的区别:仅在于运算规则的不同。
3. 栈的应用
- 由于栈的操作具有后进先出的固有特性,使得栈成为程序设计中的有用工具。
- 另外,如果问题求解的过程具有后进先出的天然特性的话,则求解的算法中也必然会利用到栈。
- 比如:
二、队列的定义和特点
- 队列是一种先进先出(First In Frist Out——FIFO)的线性表.
- 它只允许在表的一端(表尾)插入元素,而在另一端(表头)删除元素。
1. 队列的插入和删除
- 队列在插入元素的时候也只能从表尾插入,删除的时候却只能删除第一个元素。
-
想删除 3,就只能从 0 开始一直删除到 3 为止。
-
队列一般用Q来表示,将a1到an依次存入到数组当中,加入一个元素只能从队尾加入。
2. 队列的相关概念
- 定义:只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表(头删尾差)
- 逻辑结构:同线性表相同,仍为一对一的关系。
- 存储结构:顺序队或链队,以循环顺序队列更常见。
- 运算规则:只能在队首和队尾运算,且访问节点依照先进先出 FIFO的原则。
- 实现方式:关键是掌握入队和出队操作,具体实现依顺序队或链队的不同而不同
3. 队列的应用
- 由于队列的操作具有先进先出的特性,使得队列称为程序设计中解决类似排队问题的有用工具。
- 脱机打印输出:按申请的先后顺序依次输出。
- 多用户系统中,多个用户排成队,分时地循环使用CPU和主存。
- 按用户的优先级排成多个队,每个优先级一个队列。
- 实施控制系统中,信号按接收的先后顺序依次处理。
- 网络电文传输,按到达的时间先后顺序依次进行。