力扣-栈经典题-python实现

225. 用队列实现栈

Note: 没有用两个队列或者栈来实现,留下一个坑,以后补。

  • 题目: 两个队列实现一个**后入先出(LIFO)**的栈,并支持普通栈的四种操作(push、top、pop 和 empty)
class MyStack:
	def __init__(self):
		self.queue = []
	def push(self, x:int) -> None:
		self.queue.append(x)
	def pop(self) -> int:
		return self.queue.pop()
	def top(self) -> int:
		return self.queue[-1]
	def empty(self) -> bool:
		if len(self.queue) == 0:
			return True
		else:
			return False

232. 用栈实现队列

  • 题目:两个栈实现**先入先出(FIFO)**的队列,并支持普通队列的四种操作(push、pop、peek、empty):
class MyQueue:
	def __init__(self):
		self.stack = []
	def push(self, x:int) -> None:
		self.stack.append(x)
	def pop(self) -> int:
		return self.stack.pop(0)
	def peek(self) -> int:
		return self.stack[0]
	def empty(self) -> bool:
		if len(self.stack) == 0:
			return True
		else:
			return False

155. 最小栈

Note: pyhton的缩进真的绝了

  • 题目:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
class MinStack:
	def __init__(self):
		self.stack = []
		self.helpstack = []
	def push(self, val:int) -> None:
		self.stack.append(val)
		if len(self.helpstack) == 0 or val < self.helpstack[-1]:
			self.helpstack.append(val)
		else:
			self.helpstack.append(self.helpstack[-1])
	def pop(self) -> None:
		if len(self.stack) != 0:
			self.stack.pop()
			self.helpstack.pop()
	def top(self) -> int:
		if len(self.stack) != 0:
			return self.stack[-1]
	def getMin(self) -> int:
		if len(self.stack) != 0:
			return self.helpstack[-1]

20.有效的括号

  • 题目:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
  • 思路要清晰,不丢不落
  • 1.遇见左括号,压入栈内
  • 2.遇见右括号,先判断栈是否空 -> 栈空,直接返回False;栈不空,再判断是否与栈顶的左括号匹配 -> 不匹配,直接返回False;匹配,弹出栈顶元素
    1. 当整个字符串遍历完成后,判断栈内是否还有元素(多余的左括号)-> 若有,直接返回False;没有,返回True。
class Solution:
    def isValid(self, s: str) -> bool:
    	match = {'(':')', '[': ']', '{':'}'}
    	stack = []
    	for i in s:
    		if i in match:
    			stack.append(i)
    		else:
    			if len(stack) == 0:   # 这个容易忘记:遇见右括号时需要先判断栈是否空
    				return False
    			elif i != match[stack.pop()]:  # stack.pop()的巧妙用法,这里遍历没有用索引,所以使用stack.pop()获得栈顶的左括号,且比较完后,直接弹出
    				return False
    			else:
    				pass
    	if len(stack) != 0:
    		return False
    	else:
    		return True 

739.每日温度

  • 题目:给定一个整数数组temperatures ,表示每天的温度,返回一个数组res ,其中res[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
  • 方法很巧妙,用enumerate获得数组里各个元素的索引和值。
    1.遍历第一个元素73,此时栈空,将第一个元素的索引压入栈内,即stack = [0]
    2.遍历第一个元素74,此时栈不空,且当前遍历到的元素74大于在temperatures中索引为栈顶元素的值,即temperatures[0],即73。此时,用当前索引减去栈顶元素即计算下一个更高温度出现在几天后。将得到的值赋给res数组中索引为栈顶元素的地方。
    3.注意使用了while循环和stack.pop。遍历到当前位置时,会一直比较当前位置的值是否比前面最大的值的大,直到整个数组遍历完成。
class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
    	stack = []  # 里面装着索引
    	res = [0] * len(temperatures):
    	for index, t in enumerate(temperatures):
    		while stack and t > temperatures[stack[-1]]:  # 如果栈不空且当前元素大于前面的元素
    			res[stack.pop()] = index - stack[-1]
    		stack.append(index)
    	return res  			

503. 下一个更大的元素2

  • 题目:给定一个循环数组 nums,返回 nums 中每个元素的 下一个更大元素 ,如果不存在,则输出 -1 。
  • 和上一题是一样的思路,除了循环数组这里需要用循环两次数组并用求余处理索引
class Solution:
    def nextGreaterElements(self, nums: List[int]) -> List[int]:
    	stack = []
    	res = [-1] * len(nums)
    	for i in range(len(nums)*2):
    		index = i % len(nums)
    		while stack and nums[index] > nums[stack[-1]]:
    			res[stack.pop()] = nums[index]
    		stack.append(index)
    	return res
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值