栈和队列相互实现

本文详细介绍如何使用队列实现栈的功能,以及如何使用栈实现队列的功能。通过双队列和双栈的方式,实现栈和队列的基本操作,如push、pop、top和empty等。文章还解释了list函数中pop操作的不同含义,帮助读者更好地理解和掌握数据结构转换的技巧。
摘要由CSDN通过智能技术生成

栈和队列相互实现

题目一 队列实现栈
要求:使用队列实现栈的下列操作:push(x),pop(),top(),empty()
方法:利用双队列deque实现栈,操作方便,效率较高
思路:(1)push()操作,为了保证先进栈的元素一直在栈底,需要将两个队列交替使用,才可满足需求,所以我们在空的队列添加元素,然后将非空队列的元素全部追加到当前队列,然后方便下次添加元素至空队列。
(2)pop()操作,在添加元素时,我们已经按照进栈的先后顺序把新进栈的元素放在一个队列的头部,所以出栈时,我们只需找到非空的队列将数据依次取出。
(3)top()操作,需将顶部元素取出,将入栈元素依次出栈,再将所要数据取出即可

code

class Solution:
	def __init__(self):
		self.q1 = []
		self.q2 = []
	def push(self, x:int):
		self.q1.append(x)
	def pop(self):
		if len(self.q1) == 0:
			print('empty')
		if len(self.q1) == 1:
			return self.q1.pop(0)
		while len(self.q1) > 1:
			self.q2.append(self.q1.pop(0))
		res = self.q1.pop(0)
		self.q1, self.q2 = self.q2, self.q1
		return res
	def top(self):
		while len(self.q1) != 1:
			self.q2.append(self.q1.pop(0))
		res = self.q1.pop(0)
		self.q2.append(res)
		return res
	def empty(self):
		return not bool(self.q1)

题目二 栈实现队列
要求:使用栈实现队列的下列操作:push(x),pop(),peek(),empty()
方法:使用两个栈实现队列,操作高效简洁
思路:入1栈的特点是FILO,所以来回操作两次,就可变成队列。入栈时,直接进stack1栈,出栈时,先看stack2中是否有元素,如果有,则直接输出,如果没有,将1栈元素依次排进2栈后,再进行输出。

code

class Solution:
	def __init__(self):
		self.stack1 = []
		self.stack2 = []
	def push(self, x:int):
		self.stack1.append(x)
	def pop(self):
		if self.empty():
			return None
		if len(self.stack2) > 0:
			return self.stack2.pop()
		else:
			while len(self.stack1) > 0:
				self.stack2.append(self.stack1.pop())
			return self.stack2.pop()
	def top(self):
		if self.empty():
			return None
		if len(self.stack2) > 0:
			return self.stack2[-1]
	    else:
			while len(self.stack1) > 0:
				self.stack2.append(self.stack1.pop())
			return self.stack2[-1]
	def empty(self):
		if len(self.stack1) == 0 and len(self.stack2) == 0:
			return True
		else:
			return False

理解list函数中pop()操作的真正含义:
(1)pop(0):其意义是输出list中的首元素,实现队列效果。
(2)pop()/pop(-1):其意义是输出list中的末尾元素,实现栈效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值