【数据结构】栈的基本知识简介


一、栈简介

栈(stack)是一种线性表结构,只允许在表的一端进行插入和删除操作的线性表。简单来说,栈一种后进先出(Last In First Out)的线性表,简称为LIFO结构。

把栈中允许插入和删除的一端成为栈顶(top);另一段则成为栈底(bottom)。当表中没有任何元素是,称为空栈。从两个方面来解释栈的定义:

  1. 线性表:栈首先是一个线性表,按照次序依次进栈,栈顶元素为 a n a_n an
  2. 后进先出原则:每次删除的总是当前的栈顶元素;在进栈时,一线进入堆栈的一定在栈底,最后进入堆栈的一定在栈顶。

栈的基本操作有:

  • 初始化空栈
  • 判断栈是否为空
  • 判断栈是否已满
  • 插入元素(进栈、入栈)
  • 删除元素(出栈、退栈)
  • 获取栈顶元素

二、栈的插入

栈有两种插入方法:顺序插入和链表插入。

2.1栈的顺序存储基本描述

约定self.top指向栈顶元素所在位置。

  • 初始化空栈:创建一个空栈,定义其大小为self.size,并令栈顶元素指针self.top=-1
  • 判断栈是否为空:当self.top==-1说明栈为空,返回True
  • 判断栈是否已满:当self.top==self.size-1说明栈已满,返回True
  • 获取栈顶元素:先判断堆栈是否为空,为空直接抛出异常,不为空则返回self.top指向的栈顶元素,即self.stack[self.top]
  • 插入元素(进栈、入栈):先判断堆栈是否已满,已满则直接抛出异常。如果堆栈未满,则在self.stack末尾插入新的元素,并令self.top向右移动1位。
  • 删除元素(出栈、退栈):先判断堆栈是否为空,为空则直接抛出异常。如果堆栈不为空,则先让self.top向左移动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的链表节点,插入到链表头结点之前,并令栈顶置针self.top指向新的头节点。
  • 删除元素:先判断队列是否为空,为空直接抛出异常。如果堆栈不为空,则令self.top移动1位,并返回self.top.value
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原则,可以保证特定的存取顺序。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值