232.用栈实现队列
class MyQueue:
def __init__(self):
self.s1=[]
self.s2=[]
def push(self, x: int) -> None:
self.s1.append(x)
def pop(self) -> int:
self.peek()
return self.s2.pop()
def peek(self) -> int: #返回队头元素
if not self.s2: #检查是否为空
#把s1元素压入s2
while self.s1:
self.s2.append(self.s1.pop())
return self.s2[-1]
def empty(self) -> bool:
return not self.s1 and not self.s2
225.用队列实现栈
class MyStack:
def __init__(self):
self.queue=deque()
def push(self, x: int) -> None:
self.queue.append(x)
def pop(self) -> int:
if self.empty():
return None
for i in range(len(self.queue)-1):
self.queue.append(self.queue.popleft())
return self.queue.popleft()
def top(self) -> int:
if self.empty():
return None
for i in range(len(self.queue)-1):
self.queue.append(self.queue.popleft())
temp = self.queue.popleft()
self.queue.append(temp)
return temp
def empty(self) -> bool:
return not self.queue
20.有效的括号
本题最重要的就是分析出来错误的情况有哪几种:
- 左括号多余了
- 右括号多余了
- 没有多余括号,但是括号不匹配
代码逻辑:
如果遇到左括号,就将对应的右括号压入栈中;
如果遇到右括号,就判断现在栈是否为空,如果为空就说明没有对应的左括号匹配了,返回False;或者看栈顶元素是否与item相同,如果不同,也返回False。
如果有对应的左括号,则将栈里的元素弹出
当栈为空时返回True,否则返回False.
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()
return True if not stack else False
1047.删除字符串中的所有相邻重复项
思路和上一题很类似!感觉栈的题有一通百通的
class Solution:
def removeDuplicates(self, s: str) -> str:
stack=[]
for item in s:
if not stack or item != stack[-1]:
stack.append(item)
elif stack[-1]==item:
stack.pop()
elif stack[-1]!=item:
stack.append(item)
return ''.join(stack)