文章目录
- 一、栈简介
- 二、栈的插入
- 2.1栈的顺序存储基本描述
- 2.2栈的链式存储实现
- 三、栈的应用
一、栈简介
栈(stack)是一种线性表结构,只允许在表的一端进行插入和删除操作的线性表。简单来说,栈一种后进先出(Last In First Out)的线性表,简称为LIFO结构。
把栈中允许插入和删除的一端成为栈顶(top);另一段则成为栈底(bottom)。当表中没有任何元素是,称为空栈。从两个方面来解释栈的定义:
- 线性表:栈首先是一个线性表,按照次序依次进栈,栈顶元素为 a n a_n an。
- 后进先出原则:每次删除的总是当前的栈顶元素;在进栈时,一线进入堆栈的一定在栈底,最后进入堆栈的一定在栈顶。
栈的基本操作有:
- 初始化空栈
- 判断栈是否为空
- 判断栈是否已满
- 插入元素(进栈、入栈)
- 删除元素(出栈、退栈)
- 获取栈顶元素
二、栈的插入
栈有两种插入方法:顺序插入和链表插入。
2.1栈的顺序存储基本描述
约定指向栈顶元素所在位置。
- 初始化空栈:创建一个空栈,定义其大小为
,并令栈顶元素指针
=-1
; - 判断栈是否为空:当
==-1
说明栈为空,返回True
; - 判断栈是否已满:当
==-1
说明栈已满,返回True - 获取栈顶元素:先判断堆栈是否为空,为空直接抛出异常,不为空则返回指向的栈顶元素,即
[]
。 - 插入元素(进栈、入栈):先判断堆栈是否已满,已满则直接抛出异常。如果堆栈未满,则在
末尾插入新的元素,并令
向右移动1位。
- 删除元素(出栈、退栈):先判断堆栈是否为空,为空则直接抛出异常。如果堆栈不为空,则先让
向左移动1位,再删除当前堆栈元素。
# 顺序存储实现代码
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 is_full():
raise Exception('Stack is Full')
else:
self.stack.append(value)
self.top+=1
#出栈操作
def pop(self):
if is_empty():
raise Exception('Stack is empty')
else:
self.top-=1
self.stack.pop()
#获取线性元素
def peek(self):
if self.is_empty():
raise Exception('Stack is empty')
else:
return self.stack(self.top)
2.2栈的链式存储实现
堆栈的顺序存储结构保留着顺序存储分配空间的固有缺陷,在栈满或者其他需要重新调整存储空间时需要移动大量元素。为此,堆栈通过构造链表结点的链式存储方式。
与顺序寻处不同的是插入元素(进栈、入栈)和删除元素(出栈、退栈)。
- 插入元素:创建值为
value
的链表节点,插入到链表头结点之前,并令栈顶置针指向新的头节点。
- 删除元素:先判断队列是否为空,为空直接抛出异常。如果堆栈不为空,则令
移动1位,并返回
。
class Node:
def __init__(self,value):
self.value=value
self.next=None
class Stack:
#初始化空栈
def __init(self)L
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
三、栈的应用
基本应用于两个方面:
- 使用栈可以方便的保存和取用信息,常被用作算法和程序中的辅助存储结构,临时保存信息。
- 堆栈的LIFO原则,可以保证特定的存取顺序。