数据结构基础02-栈和队列

本文系列

数据结构基础01-基本概念和术语/线性表

数据结构基础02-栈和队列

栈(Stack):所有的插入和删除只在表的一端进行的线性表,即是一种操作受限的线性表。在表中,允许插入和删除的一端叫栈顶(top),不允许插 入和删除的另一端叫栈底(bottom)。

特点
“先进后出”或“后进先出”(LIFO,Last In First Out)。n = 0 时称为空栈(此时栈中无任何元素)。

栈的操作
进栈(压栈) PUSH
出栈(弹栈) POP

栈的应用
1.进制转换
2.括号匹配的检验
3.迷宫求解:若当前位置“可通”,则纳入路径,继续前进;若当前位置“不可通”,则后退,换方向继续探索;若四周“均无通路”,则将当前位置从路径中删除出去。
4.表达式求解:前缀、中缀、后缀。
5.实现递归:多个函数嵌套调用的规则是:后调用先返回。
6.浏览器历史纪录,Android中的最近任务,Activity的启动模式,CPU中栈的实现,Word自动保存,解析计算式,解析xml/json。解析XML时,需要校验节点是否闭合,节点闭合的话,有头尾符号相对应,遇到头符号将其放入栈中,遇到尾符号时,弹出栈的内容,看是否有与之对应的头符号,栈的特性刚好符合符号匹配的就近原则。
7.行编辑程序

顺序存储栈: 顺序存储结构

链栈: 链式存储结构。插入和删除操作仅限制在链头位置上进行。栈顶指针就是链表的头指针。通常不会出现栈满的情况。 不需要判断栈满但需要判断栈空。

两个栈共用静态存储空间,对头使用也存在空间溢出问题。栈1的底在v[1],栈2的底在V[m],则栈满的条件是top[1]+1=top[2]。

基本操作: 删除栈顶元素、判断栈是否为空以及将栈置为空栈等

对于n各元素的入栈问题,可能的出栈顺序
在这里插入图片描述

堆栈溢出一般是循环的递归调用、大数据结构的局部变量导致的
应用,代码:

队列

队列(Queue)也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。先进先出。

顺序队列: 顺序存储结构。当头尾指针相等时队列为空。在非空队列里,头指针始终指向队头前一个位置,而尾指针始终指向队尾元素的实际位置

循环队列。 在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界(MaxSize-1)时,其加1操作的结果是指向向量的下界0。除非向量空间真的被队列元素全部占用,否则不会上溢。因此,除一些简单的应用外,真正实用的顺序队列是循环队列。故队空和队满时头尾指针均相等。因此,我们无法通过front=rear来判断队列“空”还是“满”

链队列: 链式存储结构。限制仅在表头删除和表尾插入的单链表。显然仅有单链表的头指针不便于在表尾做插入操作,为此再增加一个尾指针,指向链表的最后一个结点。

设尾指针的循环链表表示队列,则入队和出队算法的时间复杂度均为O(1)。用循环链表表示队列,必定有链表的头结点,入队操作在链表尾插入,直接插入在尾指针指向的节点后面,时间复杂度是常数级的;出队操作在链表表头进行,也就是删除表头指向的节点,时间复杂度也是常数级的。

队空条件: rear==front,但是一般需要引入新的标记来说明栈满还是栈空,比如每个位置布尔值

队满条件: (rear+1) % QueueSize==front,其中QueueSize为循环队列的最大长度

计算队列长度:(rear-front+QueueSize)% QueueSize

入队:(rear+1)% QueueSize
出队:(front+1)% QueueSize

猜你喜欢

转载自blog.csdn.net/u013728021/article/details/84550905