练习内容:
1.LeetCode739-每日温度
请根据每日气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0来代替。
例如,给定一个列表temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是[1, 1, 4, 2, 1, 1, 0, 0]。
题目来自leetcode
单调栈方法:
思路:
列表中必须是单调递增或递减的数值
1.先定义一个栈stack,再定义一个与栈等长的ans。
2.遍历列表中的数值,依次放入栈中,将当前的数值与栈顶元素作比较。
3.当弹出的栈顶元素小于当前数值时,放入ans中。
python代码如下:
class Solution:
def dailyTemperatures(self, T: List[int]) -> List[int]:
stack = []
ans = [0] * len(T)
for t in range(0,len(T)):
while stack and T[t] > T[stack[-1]]:
peek = stack.pop(-1)
ans[peek] = t - peek
stack.append(t)
return ans
代码执行后:

时间复杂度: O(n)
空间复杂度: O(n)
2.面试题 16.26. 计算器
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: "3*4 + 5*9/2 + 3"
输出: 37
题目来自leetcode
思路:
利用栈的特点,将前后两个数值进行四则运算。
1.先定义一个栈stack,在字符串s末尾设置哨兵。
2.将字符串中的数值放在栈中,优先进行* /运算,弹出的栈顶元素与当前数值进行运算,再加入栈中。
3.+ -运算的数值直接加入栈中,最后将stack中的所有数值加在一起。
python代码如下:
class Solution:
def calculate(self, s: str) -> int:
stack =[]
# 哨兵:在字符串末尾加上特殊符号,设置边界
s += "@"
op ="+"
num = 0
for i in s:
if i.isdigit():
num = num * 10 + int(i)
elif i == " ":
continue
else:
if op == "@":
break
elif op == "+":
stack.append(num)
elif op =="-":
stack.append(-num)
elif op == "*":
stack.append(stack.pop(-1) * num)
elif op == "/":
stack.append(int(stack.pop(-1) / num))
op = i
num = 0
return sum(stack)
代码执行后:

时间复杂度:O(n)
空间复杂度:O(n)
总结
本周的两道题都是针对栈的知识点展开。
栈的特点:
受限制的数据结构,只可以从单方向进行数据的压入或弹出(LIFO),即后进先出。
- 本周两题任务完成
本周的两道编程题都涉及到了栈的应用。第一题LeetCode739-每日温度,通过单调栈找到观测更高气温所需的等待天数;第二题面试题16.26.计算器,使用栈实现简单的算术表达式计算。两题均利用栈的后进先出特性,高效解决实际问题。时间复杂度和空间复杂度均为O(n)。

被折叠的 条评论
为什么被折叠?



