232.用栈实现队列
ass MyQueue(object):
def __init__(self):
self.stack_in = []
self.stack_out = []
def push(self, x):
self.stack_in.append(x)
def pop(self):
if self.empty():
return None
if self.stack_out:
return self.stack_out.pop()
else:
for i in range(len(self.stack_in)):
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
def peek(self):
ans = self.pop()
self.stack_out.append(ans)
return ans
def empty(self):
return not (self.stack_in or self.stack_out)
用栈来模拟队列,需要两个栈,一个输入栈一个输出栈。
push的时候只需要把数据放入输入栈,pop的时候,如果输出栈为空就把进栈数据全部导入进来,再从输出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据。
如果进栈和出栈都为空的话,说明模拟的队列为空。
225. 用队列实现栈
按照代码随想录的题解,可以通过两个队列实现栈,这种方法是为了加深印象,更好的理解栈和队列。但由于这几天太忙了,我来不及理解……就用一个队列简单实现了。
class MyStack:
def __init__(self):
self.que = deque()
def push(self, x):
self.que.append(x)
def pop(self):
if self.empty():
return None
for i in range(len(self.que)-1):
self.que.append(self.que.popleft())
return self.que.popleft()
def top(self):
if self.empty():
return None
return self.que[-1]
def empty(self):
return not self.que
20. 有效的括号
这道题之前笔试做过,印象深刻……直接写了:
class Solution(object):
def isValid(self, s):
stack = []
for i in s:
if i == '(':
stack.append(')')
elif i == '[':
stack.append(']')
elif i == '{':
stack.append('}')
elif not stack or stack[-1] != i:
return False
else:
stack.pop()
return True if not stack else False
我参考了题解的写法,如果是左括号,就把对应的右括号压入栈。在遍历时,如果栈已经空了或者栈头括号不匹配,直接输出False,如果没有以上情况,把栈头的括号删了。如果遍历完了栈还是没空,也是输出False。
1047. 删除字符串中的所有相邻重复项
这道题笔试考过,再写一遍:
class Solution(object):
def removeDuplicates(self, s):
stack = []
for a in s:
if stack and stack[-1] == a :
stack.pop()
else:
stack.append(a)
return ''.join(stack)