关键在于入栈,q1作为存储队列,q2作为压栈操作队列,先将元素压入q2,再按顺序将q1的元素转移到q2,同时交换q1,q2 的引用。
python
class MyStack:
def __init__(self):
self.q1 = deque()
self.q2 = deque()
def push(self, x: int) -> None:
self.q2.append(x)
while self.q1 :
self.q2.append(self.q1.popleft())
self.q1, self.q2 = self.q2, self.q1
def pop(self) -> int:
return self.q1.popleft()
def top(self) -> int:
return self.q1[0]
def empty(self) -> bool:
return len(self.q1) == 0
# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()
deque和queue的区别:
-
queue是多线程安全的,deque不是
-
queue的效率比较慢,操作只能是先进先出
-
deque在单线程中效率高,有多样的操作(在两端进行添加(
append()
、appendleft()
) 和删除 (pop()
、popleft()
) 操作时,时间复杂度为 O(1))
用栈的方式判断括号是否合法。
python
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for x in s:
if x == '(' or x == '[' or x == '{':
stack.append(x)
else:
if len(stack) == 0:
return False
temp = stack.pop()
if x == ')' and temp != '(':
return False
if x == ']' and temp != '[':
return False
if x == '}' and temp != '{':
return False
if not len(stack) == 0:
return False
return True
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
python
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for char in s :
if len(stack) == 0:
stack.append(char)
continue
top_char = stack[-1]
if top_char == char:
stack.pop()
else:
stack.append(char)
return ''.join(stack)