1. 用栈实现队列:
题目链接: 232. 用栈实现队列 - 力扣(LeetCode)
应用条件:
难点:
要想到可以用两个栈,stackin用做push,stackout用做pop,每次push,stackin收纳元素,pop操作的时候,把stackin的所有元素一个一个pop出来再一个一个push进stackout中,然后popstackout就好了。这里有一点值得注意,就是我们需要判断stackout是否为空,在为空的情况下像刚才那么操作,在不为空的情况下,因为stackout中元素的顺序已经反过来了,所以在不为空的情况下直接stackout pop出来,就是我们要找的哪个元素。
个人错误:
对这种实现方法类的题目还是不熟练,有些陌生。
思路:
如下
class MyQueue:
def __init__(self):
self.stackin = []
self.stackout = []
def push(self, x: int) -> None:
self.stackin.append(x)
def pop(self) -> int:
if self.empty():
return None
if self.stackout:
return self.stackout.pop()
else:
for i in range(len(self.stackin)):
self.stackout.append(self.stackin.pop())
return self.stackout.pop()
def peek(self) -> int:
ans = self.pop()
self.stackout.append(ans)
return ans
def empty(self) -> bool:
return not (self.stackin or self.stackout)
2. 用队列实现栈:
题目链接: 225. 用队列实现栈 - 力扣(LeetCode)
应用条件:
难点:
直接用双端列表进行操作,偷懒了,创建一个双端列表:d = deque(),双端列表中的操作:从右侧(尾部)添加一个元素 d.append(), 从左侧(头部)添加一个元素 d.appendleft(),从右侧(尾部)删除一个元素 d.pop(),从左侧(头部)删除一个元素 d.popleft()
个人错误:
无。
思路:
如下
class MyStack:
def __init__(self):
self.que = deque()
def push(self, x: int) -> None:
self.que.appendleft(x)
def pop(self) -> int:
return self.que.popleft()
def top(self) -> int:
temp = self.que.popleft()
self.que.appendleft(temp)
return temp
def empty(self) -> bool:
return not self.que
3. 有效括号:
题目链接: 20. 有效的括号 - 力扣(LeetCode)
应用条件:
难点:
主要是要想到两点,第一:我们遍历整个字符串,遇到左括号直接将其对应类型的右括号加入到栈中,遇到右括号,我们直接找栈的最顶端的元素,判断它与当前遇到的右括号是不是一样,如果不一样或者没有了就返回false,一样就继续匹配。最后如果栈是空的就返回true,如果还有就返回false.
个人错误:
想不到用栈来解决,想用dictionary,发现很难解决前后顺序问题。
思路:
如下
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for item in s:
if item == '(':
stack.append(')')
elif item == '[':
stack.append(']')
elif item == '{':
stack.append('}')
elif not stack or stack[-1] != item:
return False
else:
stack.pop()
if stack:
return False
else:
return True