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;匹配,弹出栈顶元素
-
- 当整个字符串遍历完成后,判断栈内是否还有元素(多余的左括号)-> 若有,直接返回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