二、3.栈与队列

3.栈与队列:栈与队列是两种特殊的线性表,它们的逻辑结构与线性表的逻辑结构相同,但在运算操作方面较线性表有更多的限制,它们是重要的线性数据结构,通常被称为运算受限的线性表。在面向对象的程序设计中,它们是多型数据类型。
3.1栈 3.2栈的应用举例 3.3栈与递归 3.4队列

1.栈的定义
栈是一种“先进后出”的一种数据结构,有压栈出栈两种操作方式。
2.栈主要分为两类:
【静态栈】
静态栈的核心是数组,类似于一个连续内存的数组,我们只能操作其栈顶元素。
【动态栈】
静态栈的核心是数组,类似于一个连续内存的数组,我们只能操作其栈顶节点。
3.队列 (Queue)是一种先进先出(first in first out : FIFO)的线性表。它只允许在表的一端进行插入,在另一端进行删除元素。这和我们平时战队买票很一样。最早进入队列的元素最先离开,在队列中,允许插入的一端叫做队尾(rear),允许删除的一段则称为队头(front).
4.队列主要分为两类:
链式队列:链式队列即用链表实现的队列
顺序队列:顺序队列是用数组实现的队列,顺序队列通常必须是循环队列
在这里插入图片描述
在这里插入图片描述 4.1 顺序队列为什么是循环队列
循环队列是针对顺序队列中最大内存空间有限,当队列处于上图(d)的状态时,不可再继续插入新的队尾元素,否则会因为数组越界而导致程序代码被破坏。然而此时又不宜进行存储再分配扩大数组空间,因为队列的实际可用空间并未占满的问题的一种合理的解决方案。

4.2 一共需要几个参数,分别是什么含义
front && rear
不同场合下含义不同。

  1. 队列初始化 – front 和 rear 的值都是零
  2. 队列非空 – front 代表队列的第一个元素,rear 代表队列的最后一个有效元素的下一个元素
  3. 队列为空 – front 和 rear 相等,但不一定是零

4.3 入队伪算法
尾部入队,分两步完成

  1. 将值存入r所代表的位置
  2. 错误写法 r = r + 1; 正确写法: r = (r + 1) % 数组的长度 【n-1对n取余,结果就是n-1】

4.4 出队伪算法
头部出队,分两步完成

  1. 将f出队的值保存起来(可以根据具体需求确定是否要保存)
  2. f 的指针变动正确写法: f = (f + 1) % 数组的长度 【n-1对n取余,结果就是n-1】

4.5 如何判断循环队列是否为空
如果front == rear ,则该队列一定为空

2.6 如何判断循环队列已满
预备知识:
front 的值可能比 rear 大
front 的值也可能比 rear 小
当然两者也完全可能相等

判断已满两种方式:

  1. 多增加一个标识参数
  2. 少用数组中的一个元素【可以直接用两个参数,通常使用第二种方式】
    如果r 和 f 的值紧挨着,则标识队列已满
    C语言标识就是:
    if ( (r+1)%数组长度 == f)
    队列已满
    else
    队列未满

4.7 什么时候该使用顺序队列?什么时候该使用链式队列?
如果用户的应用程序中设有循环队列,则必须为它设定一个最大队列长度,若用户无法预估所用队列的最大长度,则宜采用链式队列

5.1.使用列表作为堆栈
list方法可以很容易地将列表用作堆栈,其中添加的最后一个元素是检索到的第一个元素(“last-in,first-out”)。要将项添加到堆栈顶部,请使用append()。要从堆栈顶部检索项目,请在pop()没有显式索引的情况下使用。例如:

stack = [3, 4, 5]
stack.append(6)
stack.append(7)
stack
[3, 4, 5, 6, 7]

stack.pop()
7

stack
[3, 4, 5, 6]

stack.pop()
6

stack.pop()
5

stack
[3, 4]

5.2 使用列表作为队列
也可以使用列表作为队列,其中添加的第一个元素是检索的第一个元素(“先进先出”); 但是,列表不能用于此目的。虽然列表末尾的追加和弹出很快,但是从列表的开头进行插入或弹出是很慢的(因为所有其他元素都必须移动一个)。
要实现队列,请使用collections.deque设计为具有快速追加和从两端弹出的队列。例如:

from collections import deque
queue = deque([“Eric”, “John”, “Michael”])
queue.append(“Terry”) # Terry arrives
queue.append(“Graham”) # Graham arrives
queue.popleft() # The first to arrive now leaves
‘Eric’

queue.popleft() # The second to arrive now leaves
‘John’

queue # Remaining queue in order of arrival
deque([‘Michael’, ‘Terry’, ‘Graham’])

猜你喜欢

转载自blog.csdn.net/q386538588/article/details/86303040