栈和队列
定义
栈:栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”。
队列:队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”,允许进行删除操作的一端称为“队头”。
特性
栈:先进后出,出入口只有一个
队列:先进后出,一般设置有队头,队尾,通常队头入队,队尾出队,中间不会进行数据操作。
顺序存储代码实现
栈
"""
思路:
1、顺序存储可以使用列表实现,但是列表功能丰富,不符合栈模型要求
2、将列表功能封装,实现顺序栈的类,只提供栈的操作功能
功能,出栈,入栈,判断栈空,查看栈顶元素
"""
# 自定义异常
class StackError(Exception):
pass
# 顺序栈
class SStack:
def __init__(self):
# 空列表就是栈的存储空间
# 列表中的最后一个元素作为栈顶元素
self.__elems = []
通过封装列表中的一些功能实现栈的特性的操作,我们可以通过列表插入元素,弹出尾部元素实现进栈和出栈。
# 判断栈空
def is_empty(self):
return self.__elems == []
# 入栈
def push(self, value):
self.__elems.append(value)
# 出栈
def pop(self):
if self.is_empty():
raise StackError("pop from empty stack")
return self.__elems.pop()
# 查看栈顶
def top(self):
if self.is_empty():
raise StackError("pop from empty stack")
return self.__elems[-1]
我们在弹栈(出栈)的时候通常会判断是否栈空,如果栈内没有元素,则弹出栈空错误。
测试代码
if __name__ == "__main__":
st = SStack()
st.push(15)
st.push(30)
st.push(20)
st.push(40)
while not st.is_empty():
print(st.pop())
队列
"""
队列的顺序存储
思路:
1、基于列表完成数据存储
2、对列表功能进行封装
3、列表的头部作为队首,尾部作为队尾
功能:入队(enqueue)出队(dequeue),判断队列为空
"""
class SqueueError(Exception):
pass
class Squeue:
# 初始化队列
def __init__(self):
self.__queue = []
#空队
def is_empty(self):
return self.__queue == []
#入队
def enqueue(self,value):
self.__queue.append(value)
#出队
def dequeue(self):
if self.is_empty():
raise SqueueError("pop from empty queue")
return self.__queue.pop(0)
#test
if __name__ =="__main__":
sq = Squeue()
sq.enqueue(10)
sq.enqueue(20)
sq.enqueue(30)
sq.enqueue(40)
while not sq.is_empty():
print(sq.dequeue())
与栈操作一样,我们创建队列类,提供队列特性的功能。这里我们用列表的头作为队头,列表尾部作为队尾。