栈与队列都属于动态集合,这两种数据结构的不同之处在于取出数据的次序不同。
栈
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。换言之,栈支持对数据按后进先出(LIFO)的次序取出,先进入的数据被压入栈底,最后插入的数据在栈顶。需要读取数据时先从栈顶弹出数据,数据的放入和取出叫做入栈(或者压栈)和出栈(或者弹栈)。
想象一下:你现在有《西游记》、《红楼梦》、《水浒传》、《三国演义》四本书,你想把它们放进一个箱子里。当你按照刚才的顺序一本一本的堆放进箱子里时,你会发现《西游记》一定是被你压在箱底而《三国演义》一定在最上面。当你想要拿出《西游记》时,你必须要先拿出《三国演义》,再拿出《水浒传》,然后是《红楼梦》,最后是《西游记》。这种就是后进先出,很类似栈的操作。
队列
队列是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表,它支持对数据按先进先出(FIFO)的次序取出,允许插入的一段为队尾,删除的一端为队头。
想想一下:你现在在肯德基排队取餐,那一定是按照先来后到的顺序,排在第一位的人先取餐先离开队列,而你要是想取餐,只能在队尾开始排队。
C++和Java里面都有封装好的栈与队列库文件,下面我们用Python中的列表来模拟一次栈与队列的操作:
class Stack():
def __init__(self): # 初始化栈
self.lists = []
def is_empty(self): # 判断是否为空栈
return len(self.lists)==0
def sizes(self): # 返回栈的长度
return len(self.lists)
def top(self): # 取栈顶元素
if len(self.lists)==0:
return None
else:
return self.lists[len(self.lists)-1]
def push_in(self,item): # 入栈
return self.lists.append(item)
def push_out(self): # 出栈
if len(self.lists)==0:
pass
else:
return self.lists.pop()
class Queue():
def __init__(self): # 初始化队列
self.lists = []
self.front = 0 # 队列头
self.rear = 0 # 队列尾
def is_empty(self): # 判断是否为空队列
return len(self.lists)==0
def sizes(self): # 返回队列长度
return len(self.lists)
def first(self): # 取队列头元素
if len(self.lists)==0:
return None
else:
return self.lists[self.front]
def last(self): # 取队列尾元素
if len(self.lists)==0:
return None
else:
return self.lists[self.rear-1]
def push_in(self,item): # 入队列
self.lists.append(item)
self.rear += 1
def push_out(self): # 出队列
if self.rear <= self.front:
pass
else:
self.lists.pop(self.front)
#self.front += 1
self.rear -=1
下面我们来运行实现一下栈与队列的一些操作。在代码中,我们以让1到5的数字分别进入栈和队列为例:
if __name__ == "__main__":
stack = Stack()
queue = Queue()
print("是否为空栈?",end = " ")
print(stack.is_empty())
print("是否为空队列?",end = " ")
print(queue.is_empty())
for i in range(1,6):
stack.push_in(i) # 1,2,3,4,5
queue.push_in(i) # 1,2,3,4,5
stack.push_out() # 此时栈为1,2,3,4
queue.push_out() # 此时队列为2,3,4,5
print("栈顶:",end = "")
print(stack.top())
print("队首:",end = "")
print(queue.first())
print("队尾:",end = "")
print(queue.last())
运行结果如下:
是否为空栈? True
是否为空队列? True
栈顶:4
队首:2
队尾:5