栈与队列理论基础——基于python
1、基本特性
队列:先进先出
栈:先进后出
2、思考
- C++中stack 是容器么?
- 我们使用的stack是属于哪个版本的STL?
- 我们使用的STL中stack是如何实现的?
- stack提供迭代器来遍历stack空间么?
在python中的使用参考:Python数据结构之栈和队列的实现(详细无敌版!!!!)
2.1 数据容器
在常用的数据结构中,有一批结构被称为容器,一个容器结构里总包含一组其它类型的数据对象,称为其元素,支持对这些元素的存储、管理和使用。一类容器具有相同性质,支持同一组操作,可以被定义为一个抽象的数据类型
最常用的数据容器即为:栈(stack)和队列(queue)
2.2 堆
(1)定义
先进后出,后进先出,并且只能在栈顶进出
(2)实现
顺序栈:用顺序表实现的栈
链式栈:用链表实现的栈
顺序栈的实现相对简单,因为对于栈的操作可以通过对顺序表的操作方法实现,不用自己定义,直接调用即可,相对简单
栈相当于一个类,实现栈的过程为方法,具体操作有判空操作、添加元素操作、弹出栈顶元素操作、返回栈顶元素操作、求栈长度操作、遍历操作等等
class Stack(object):
"""栈,使用顺序表实现"""
def __init__(self):
"""定义空栈"""
self.__items = []
def is_empty(self):
"""判断栈是否为空"""
return self.__items == []
def push(self, item):
"""添加一个新元素item到栈顶"""
self.__items.append(item)
def pop(self):
"""弹出栈顶元素,有返回值"""
return self.__items.pop()
def peek(self):
"""返回栈顶元素,有返回值"""
# 判断栈是否为空
if self.is_empty():
return None
else:
return self.__items[-1]
def size(self):
"""返回栈中的元素个数"""
return len(self.__items)
def travel(self):
"""遍历栈中的元素"""
for item in self.__items:
print(item)
if __name__ == '__main__':
s = Stack()
s.push(7)
s.push(8)
s.push(9)
s.pop()
print(s.size())
print(s.is_empty())
print(s.peek())
s.travel()
得到测试结果:
2
False
8
7
8
应用:浏览器的前进与后退
2.3 队列
(1)定义
先进先出!
操作:
入队enqueue:放一个数据到队列尾部
出队dequeue:从队列头部取一个元素
队列也是一种操作受限制的线性表数据结构
(2)实现
使用顺序表list来实现
相关操作与list操作相关
队列相当于一个类,实现队列的过程为方法,具体操作有判空操作、添加元素操作、弹出元素操作、求队列长度操作、遍历操作等等,实现如下:
class Queue(object):
def __init__(self):
"""初始化,即定义一个空队列"""
self.__items = []
def is_empty(self):
"""判空操作,判断队列是否为空"""
return self.__items == []
def enqueue(self, item):
"""向队列中添加新元素"""
self.__items.append(item)
def dequeue(self):
"""返回队列中的第一个元素"""
return self.__items.pop(0)
def size(self):
"""返回队列中的元素个数"""
return len(self.__items)
def travel(self):
"""遍历队列中的元素"""
for item in self.__items:
print(item)
if __name__ == '__main__':
q = Queue()
print(q.is_empty())
q.enqueue(7)
q.enqueue(8)
q.enqueue(9)
print(q.is_empty())
print(q.size())
print(q.dequeue())
q.dequeue()
q.travel()