栈
简介
简单来说,栈是一种后进先出的线性表
-
线性表:具有前驱后续的线性关系,栈中元素按照a_{1},a_{2},…,a_{n}
栈顶的元素叫做an
-
后续先进原则
每次删除优先删除堆栈中当前的栈顶元素,即最后进入堆栈的元素。
堆栈的存储方法
- 顺序栈:堆栈的顺序存储结构,利用一组地址连续的存储单元依次存放自栈底到栈顶的元素,同时使用指针top指示栈顶元素在顺序栈的位置
- 链式栈:利用单链表的方式来实现栈,栈中的元素按照插入顺序依次插入到链表的第一个节点之前,并使用栈顶指针top指示栈顶元素,top永远指向链表的头结点位置
栈的基本操作
- 初始化空栈:创建一个空栈,定义栈的大小size,以及栈顶元素指针top
- 判断栈是否为空:当堆栈为空时,返回True。当
栈的顺序存储基本描述
约定self.top
指向栈顶元素所在位置
栈的代码实现
class Stack:
def __init__(self,size = 100):
self.stack = []
self.size = size
self.top = -1
# 入栈
def push(self, element):
if self.is_full():
raise Exception("Stack is full")
else:
self.stack.append(element)
self.top +=1
self.stack.append(element)
# 出栈
def pop(self):
if self.is_empty():
raise Exception("Stack is empty")
else:
self.top -=1
self.stack.pop()
# 得到栈顶元素
def get_top(self):
if len(self.stack) > 0:
return self.stack[-1]
else:
return None
# 判断是否为空
def is_empty(self):
return self.top == -1
# 判断是否是满的
def is_full(self):
return self.top + 1 == self.size
#
def peek(self):
if self.is_empty():
raise Exception("Stack is empty")
else:
return self.stack[self.top]
栈的链式存储
初始化空栈:使用链表创建一个空栈,并令栈顶元素指针self.top指向None,即self.top=None。
判断栈是否为空:当self.top==None时,说明堆栈为空,返回True,否则返回False。
获取栈顶元素:先判断堆栈是否为空,为空直接抛出异常。不为空则返回sef.top指向的栈顶节点值,即self.top.value.
插入元素(进栈、入栈):创建值为value的链表节点,插入到链表头节点之前,并令栈顶指针self.top指向新的头节点。
删除元素(出栈、退栈):先判断队列是否为空,为空直接抛出异常。如果堆栈不为空,则令self.top链表移动1位,并返回self.top.value。
栈的链式j结构代码
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