1.概念
2.案例
(1)有效括号
1、问题描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
输入:s = "()[]{}" 或者 "{[]}"
输出:true
2、解题思路
右括号入栈
遍历s,遇到左括号时,假如栈为空,或者在栈里面的最后一个元素,不能匹配闭合,则s无效
能闭合,则最后一个元素出栈
遍历结束后,如果栈为空,则s有效;栈不为空,则无效
3、代码实现
def test(s):
if len(s) % 2 != 0:
return False
stack = []
pairs = {
')': '(',
'}': '{',
']': '['
}
for i in s:
if i in pairs:
if not stack or stack[-1] != pairs[i]:
return False
stack.pop()
else:
stack.append(i)
return not stack
s = "{()}"
print(test(s))
(2)循环数组的下一个更大元素
1、问题描述
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。
数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。
输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]
2、解题思路
遍历索引,次数为数组的两倍
当前数值,大于栈最后一个对应的数值,出栈
栈为空,入栈,当前数值小于栈最后一个对应的值,入栈
3、代码实现
def nextGreaterElements(self, nums: List[int]) -> List[int]:
stack = []
answer = [-1] * len(nums)
n = len(nums)
for i in range(n * 2):
while stack and nums[stack[-1] % n] < nums[i % n]:
index = stack.pop()
answer[index % n] = nums[i % n]
stack.append(i)
return answer
(3)每日温度
1、问题描述
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
2、解题思路
遍历的是数组的温度,当前的温度比栈最后一个大,那栈的最后一个元素,就找到了比他大的第一个温度,就可以出栈了。然后要记得把当前的索引也放进栈。
当前温度比栈的最后一个小,那栈的最后一个元素还没找到比他大的,不能出栈,当前的也要加到栈里面。
栈里面的元素,意味着,没有找到比自己更大的。
3、代码实现
def test(temperatures):
stack = []
answer = [0] * len(temperatures)
for i in range(len(temperatures)):
tem = temperatures[i]
while stack and tem > temperatures[stack[-1]]:
index = stack.pop()
answer[index] = i - index
stack.append(i)
return answer
temperatures = [73,74,75,71,69,72,76,73]
print(test(temperatures))