栈
只允许在一端进行插入或删除的线性表。
栈顶:栈中只允许插入和删除的一端
栈底:固定的,不允许进行插入和删除的一端
线性表是后进后出型,LIFO。
顺序栈
栈是线性表的特列,栈的顺序也是线性表顺序存储的简化,栈的顺序存储结构也叫做顺序栈。
空栈:top==-1,满栈 top == MaxSize -1,栈中元素个数 top+1 个
class Stack(object):
def __init__(self):
self.stack = []
# 进栈
def push(self, value):
self.stack.append(value)
#出栈
def pop(self):
if self.stack:
self.stack.pop()
else:
raise LookupError('stack is empty!')
# 判空
def is_empty(self):
return bool(self.stack)
# 读取栈顶元素
def top(self):
#取出目前stack中最新的元素
return self.stack[-1]
共享栈
顺序栈的存储空间大小需要事先开辟好,很多时候对每个栈各自单独开辟存储空间的利用率不如各个栈的存储空间共享。
栈满:top1 + 1 = top2
链式栈
栈是线性表的特例,线性表的存储结构还有链式存储结构,所以可以用链表的方式来实现栈。栈的链式存储也叫做链栈。
栈满:不存在
空栈:top = Null
""" 栈的链式存储"""
# 创建结点类
class Node(object):
def __init__(self,value,next = None):
self.value = value
self.next = next
class Lstack:
def __init__(self):
# 标记栈顶位置
self._top = None
def is_empty(self):
return self._top is None # 判断是否为空
# 入栈
def push(self,elem):
# node = Node(elem)
# node.next = self._top
# self._top = node
self._top = Node(elem,self._top)
# 出栈
def pop(self):
if self._top is None:
raise StackError("stack is empty")
p = self._top
self._top = p.next
return p.value
# 查看栈顶元素
def top(self):
if self._top is None:
raise StackError("stack is empty")
return self._top.value
# 栈清空
def clear(self):
self._top = None
队列
队列只允许在一端进行插入,而在另一端进行删除的线性表。
队头:允许删除的一端,又称为队首
队尾:允许插入的一端
先进入的元素必然先离开队列,即先进先出FIFO。
顺序队列
用数组来实现队列,可以将队首放在数组下标为0的位置。
循环队列
入队:rear = (rear+1)%MaxSize
出队:front= (front + 1) % MaxSize
链式队列
链式队列还是单链表,只是只能表尾插入元素,表头删除元素。
双端队列
双端队列是指允许两端都可以进行入队和出队操作的队列。