数据结构-栈
一.栈的基本概念
栈是一种特殊的线性表,其插入删除操作都只能在表的尾部进行。栈中允许插入、删除操作的一端称为栈顶,另一端称为栈底。通常栈的插入操作叫入栈,栈的删除操作叫做出栈。
栈的插入和删除操作只允许在栈顶进行,每次入栈的元素即成为栈顶元素,每次最先出栈的总是栈顶元素,所以栈是一种后进先出的线性表。
二.顺序栈
1.介绍
顺序栈是用数组实现的,因为入栈和出栈操作都是在栈顶进行的,所以增加变量top来指示栈顶元素的位置,top指向栈顶元素存储位置的下一个存储单元的位置,空栈时top=0。
2.基本操作
1)入栈操作
入栈操作push(x)是将数据元素x作为栈顶元素插入顺序栈中,主要操作如下。
(1)判断顺序栈是否为满,若满则抛出异常
(2)将x存入top所指的存储单元位置
(3)top加1
def push(self,x): """数据元素x入栈""" if self.top == self.maxSize: raise Exception("栈已满") self.stackElem[self.top] = x self.top += 1
2)出栈操作
出栈操作pop()是将栈顶元素从栈中删除并返回,主要步骤如下:
(1)判断顺序栈是否为空,若空则返回null
(2)top减1
(3)返回top所指的栈顶元素的值
def pop(self): """将栈顶元素出栈并返回""" if self.isEmpty(): return None self.top -= 1 return self.stackElem[self.top]
3.应用
利用顺序栈实现括号匹配
def isMatched(str): s = SqStack(100) #申请栈 for c in str: if c == "(": s.push(c) #如果出现了左括号,入栈 elif c == ")" and not s.isEmpty(): s.pop() #如果出现了右括号,且栈不为空,弹出栈顶的左括号 elif c == ")" and s.isEmpty(): print("括号不匹配") #如果出现了右括号,栈空了,说明右括号多了 return False if s.isEmpty(): print("括号匹配成功") else: print("括号匹配不成功") #最后栈中有多余的左括号
三.链栈
1.介绍
采用链式存储结构的栈称为链栈,由于入栈和出栈只能在栈顶进行,不存在在栈的任意位置进行插入和删除操作,所以不需要设置头节点,只需要将指针top指向栈顶元素节点
2.基本操作
1)入栈操作
入栈操作push(x)是将数据域为x的节点插入到链栈的栈顶,主要步骤如下:
(1)构造数据值域为x的新节点
(2)改变新节点和首节点的指针域,使新节点成为新的栈顶节点
def push(self,x): """x入栈""" s = Node(x,self.top) self.top = s
2)出栈操作
出栈操作pop()是将栈顶元素从链栈中删除并返回其数据域的值,主要步骤如下。
(1)判断链栈是否为空,若空则返回null
(2)修改top指针域的值,返回被删节点的数据域的值
def pop(self,x): """将栈顶元素出栈并返回""" if self.isEmpty(): return None p = self.top self.top = self.top.next return p.data