算法记录-Day10栈与队列
LeetCode 232-用栈实现队列
题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)
输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]
解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
解题思路
- 队列先进先出的特性与栈后进先出的特性想清楚
class MyQueue:
def __init__(self):
# stack基本的pop操作
self.stack_in = []
self.stack_out = []
def push(self, x: int) -> None:
self.stack_in.append(x)
print(self.stack_in)
def pop(self) -> int:
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) -> int:
# 取这个元素的值还不能删除这个元素
ans = self.pop()
# 将ans这个元素返回去
self.stack_out.append(ans)
return ans
def empty(self) -> bool:
if self.stack_in or self.stack_out:
return False
else:
return True
难点
- python如何使用栈:数组就可以表示栈,入栈就用append,出栈用pop()来展现的
LeetCode 1047-删除字符串中的所有相邻重复项
题目描述:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
解题思路
- 使用栈,当元素与栈顶元素相同时pop(),否则加入栈
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for i in s:
# pop()操作时,stack不能为空
if stack and stack[-1] == i:
stack.pop()
else:
stack.append(i)
return "".join(stack)
注意:进行pop()操作时,stack不能为空,所以要进行stack的判断。
LeetCode 20-有效的括号
题目描述:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。
输入:s = "()[]{}"
输出:true
解题思路
- 想法与上一题差不多,但是括号需要注意的时,每次需要判断如果时左括号需要入栈的时右括号。
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for i in s:
if stack and stack[-1] == i:
stack.pop()
else:
if i == '(':
stack.append(')')
elif i == '[':
stack.append(']')
elif i == '{':
stack.append('}')
else:
return False
if stack:
return False
else:
return True
方法二:使用字典
# 方法二,使用字典
class Solution:
def isValid(self, s: str) -> bool:
stack = []
mapping = {
'(': ')',
'[': ']',
'{': '}'
}
for item in s:
if item in mapping.keys():
stack.append(mapping[item])
elif not stack or stack[-1] != item:
return False
else:
stack.pop()
return True if not stack else False
总结
栈和队列的特性以及基本操作要很熟悉,一般常用的是append,pop();队列是popleft()