前言
Datawhale十月组队学习,LeetCode算法学习堆栈
提示:以下是本篇文章正文内容,下面案例可供参考
一、堆栈是什么?
堆栈:一种线性表数据结构,是一种只允许在表的一端进行插入和删除操作的线性表。具有先进后出的特性。
我认为堆栈的本质还是线性表或链表,只是对线性表或链表加上一种限制。
二、堆栈的基本操作
1.堆栈的顺序存储
堆栈的顺序存储是在数组的基础上完成的。在 Python中我们可以借助列表来实现。这种采用顺序存储结构的堆栈也被称为「顺序栈」。
在初始化顺序栈的过程中,要设置栈底和栈顶,定义顺序栈的大小。
代码如下:
class Stack:
# 初始化空栈
def __init__(self, size=100):
self.stack = []
self.size = size
self.top = -1
# 判断栈是否为空
def is_empty(self):
return self.top == -1
# 判断栈是否已满
def is_full(self):
return self.top + 1 == self.size
# 入栈操作
def push(self, value):
if self.is_full():
raise Exception('Stack is full')
else:
self.stack.append(value)
self.top += 1
# 出栈操作
def pop(self):
if self.is_empty():
raise Exception('Stack is empty')
else:
self.stack.pop()
self.top -= 1
# 获取栈顶元素
def peek(self):
if self.is_empty():
raise Exception('Stack is empty')
else:
return self.stack[self.top]
2.堆栈的链式存储
堆栈的链式存储是在链表的基础上完成的,但堆栈的链式存储又与单链表所不同,单链表的链节点指针指向的是下一个链节点的地址,而堆栈的链式存储中的链节点指针指向的是上一个链节点的地址。
在堆栈的链式存储中不需要判断链栈是否已满,只需判断链栈是否为空。堆栈的链式存储与堆栈的顺序存储不同,不需要事先定义堆栈的大小。
代码如下:
class Node:
def __init__(self, value):
self.value = value
self.next = None
class Stack:
# 初始化空栈
def __init__(self):
self.top = None
# 判断栈是否为空
def is_empty(self):
return self.top == None
# 入栈操作
def push(self, value):
cur = Node(value)
cur.next = self.top
self.top = cur
# 出栈操作
def pop(self):
if self.is_empty():
raise Exception('Stack is empty')
else:
cur = self.top
self.top = self.top.next
del cur
# 获取栈顶元素
def peek(self):
if self.is_empty():
raise Exception('Stack is empty')
else:
return self.top.value
总结
通过对堆栈的学习,了解堆栈是一种线性表数据结构,具有先进后出的特性。可以根据这种特性,解决具有相同特性的问题,例如括号问题、逆波兰表示法求值等。堆栈的表示有两种方式,一堆栈的顺序存储,这是在数组的基础上完成的,在初始化顺序栈的过程中,要设置栈底和栈顶,定义顺序栈的大小;二堆栈的链式存储,这是在链表的基础上完成的,但堆栈的链式存储又与单链表所不同,单链表的链节点指针指向的是下一个链节点的地址,而堆栈的链式存储中的链节点指针指向的是上一个链节点的地址。在堆栈的链式存储中不需要判断链栈是否已满,只需判断链栈是否为空。堆栈的链式存储与堆栈的顺序存储不同,不需要事先定义堆栈的大小。
在有了数组,链表知识的基础上,再去学习堆栈,理解起来会非常容易。
我认为堆栈的本质还是线性表或链表,只是对线性表或链表加上一种限制。