提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
栈如同叠猫猫,而队列就像猫猫排队。
两者分别代表先入后出和先入先出的逻辑关系。
另外,栈和队列我们不应只将其作为两种数据结构,还应将其当成两种编程思想来学习。很多具有先入后出、先入先出关系的问题都可以利用栈和队列的思想来解决。
一、栈
1 栈的定义
栈(stack)是一种遵循先入后出逻辑的线性数据结构。
我们可以将栈类比为桌面上的一摞盘子,如果想取出底部的盘子,则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素(如整数、字符、对象等),就得到了栈这种数据结构。
如图 5-1 所示,我们把堆叠元素的顶部称为“栈顶”,底部称为“栈底”。将把元素添加到栈顶的操作叫作“入栈”,删除栈顶元素的操作叫作“出栈”。
2 栈的常用操作(Python中入栈与出栈操作)
栈的常用操作如下所示,具体的方法名需要根据所使用的编程语言来确定。在此,我们以常见的 push()、pop()、peek() 命名为例(Python里面就是append哪些)。
- 元素入栈(添加至栈顶):push() , 时间复杂度 O ( 1 ) O(1) O(1)
- 栈顶元素出栈 : pop() , 时间复杂度 O ( 1 ) O(1) O(1)
- 访问栈顶元素 : peek(), 时间复杂度 O ( 1 ) O(1) O(1)
下面给出Python语言的栈是怎么用,Python中栈直接用列表就可以了,append()和pop()的效率足够快。
----- 使用列表当栈使用
【注】:列表尾是栈顶,列表头栈底,进出都只能通过栈顶。
- stack.append(a) : 压栈,元素a入栈。
- stack.pop() : 出栈,列表最后一个元素出栈(这也符合先入后出)
- 栈元素访问:列表的访问就是了。
下面是演示:
# 初始化栈
# Python 没有内置的栈类,可以把 list 当作栈来使用
stack = []
# 元素入栈
stack.append(1)
stack.append(3)
stack.append(2)
stack.append(5)
stack.append(4)
# 元素出栈
cur = stack.pop()
# 访问栈顶元素
peek = stack[-1]
# 获取栈的长度
size = len(stack)
3 栈的实现*
规定:
规定链表头部是栈顶,链表尾部是栈底
规定列表尾部是栈顶,列表头部是栈底
(1)基于链表实现
from typing import Union
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
# 规定链表头部是栈顶,链表尾部是栈底
# 规定列表尾部是栈顶,列表头部是栈底
class Stack:
def __init__(self):
self.stack : Union[ListNode, None] = None
self.size: int = 0
def get_size(self):
'''返回栈的大小'''
return self.size
def is_empty(self):
'''判断栈是否为空'''
return self.size == 0
def peek(self):
'''返回栈顶元素'''
if self.is_empty():
return None
return self.stack.val
def push(self, x: int):
'''入栈'''
node = ListNode(x)
node.next = self.stack
self.stack = node
self.size += 1
def pop(self):
'''出栈'''
# 链表头是栈顶
num = self.peek()
if num is not None:
self.stack = self.stack.next
self.size -= 1
return num
def to_list(self):
'''将栈转换为列表用于打印'''
res = []
node = self