代码训练营 Day 11 | 栈与队列 02

今日第一题:
​​​​​​20. Valid Parentheses

栈的经典应用:
括号匹配

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.
  3. Every close bracket has a corresponding open bracket of the same type.

1)数量要匹配

2)类型要匹配

3)顺序要匹配

重点⚠️ 如果遇到(就要放进),要放进对应的符号

s = "()[]{}"
len(s) % 2

##剪枝--如果字符串是奇数,那么一定是有不匹配的情况
if (len(s)%2 !=0):
    print(False)


stack = []

for item in s:
    if item == '(':
        stack.append(')')

    elif item == '[':
        stack.append(']')

    elif item == '{':
        stack.append('}')

    elif not stack or stack[-1]!=item:
        print(False)


"""1、not stack:这个条件检查栈是否为空。如果栈为空,表示前面没有遇到匹配的开括号,
    而当前的 item 是一个闭括号,这时候无法找到与之匹配的开括号,所以字符串 s 不是有效的括号序列。
   2、stack[-1] != item:这个条件检查栈顶的开括号是否与当前的 item 匹配。
    如果它们不匹配,说明当前的 item 不是与栈顶的开括号相匹配的闭括号,同样表示字符串 s 不是有效的括号序列。"""
    
    else:
        stack.pop()
    return True if not stack else False

## 根据 stack 是否为空来决定返回 True 或 False。

今日第二题:

1047. Remove All Adjacent Duplicates In String

重点:可以把字符串逆转来添加

s = "abbaca"


## 使用栈
stack = [] #但是为啥不用这个
res = list()

for item in s:
    if res and res[-1] == item:
        res.pop()
        print(res)
    else:
        res.append(item)
        print(res)
    
print ("".join(res)) #字符串拼接



# for item in s:
#     if not stack:
#         stack.append(item)
#     if stack[-1] == item:
#         stack.pop(item)
#     else:
#         stack.append(item)

# print(stack)


"""使用 stack = [] 和 stack.append() 是可以达到相同效果的,
因为列表(list)在 Python 中本身就可以充当栈(stack)的数据结构。
实际上,list 本身就是一种动态数组,可以用来实现栈的所有操作,
包括入栈、出栈、查看栈顶元素等。
完全可以使用 stack = [] 来代替 stack = list(),它们的效果是一样的。"""

stack = []  # 创建一个空的栈

for item in s:
    if stack and stack[-1] == item:
        stack.pop()
        print(stack)
    else:
        stack.append(item)
        print(stack)

print("".join(stack))

今日第三题:

150. Evaluate Reverse Polish Notation

概念:后缀表达式

from operator import add,sub,mul

op_map={'+':add,'-':sub,'*':mul,'/':lambda x,y:int(x/y)}

stack = []

for token in tokens:
    if token not in{'+','-','*','/'}:
        stack.append(int(token))
# if token not in {'+', '-', '*', '/'}::如果当前元素不是运算符,即它是操作数,那么将其转换为整数并压入栈中。
    
    else:
#否则,如果当前元素是运算符,那么从栈中弹出两个操作数(分别是栈顶的两个元素),然后执行与运算符对应的操作函数,将计算结果压入栈中。这里利用了 op_map 字典来查找相应的操作函数,并传递两个操作数给它。

        op2 = stack.pop()
        op1 = stack.pop()
        stack.append(self.op_map[token](op1,op2))

#最终,当遍历完所有元素后,栈中应该只剩下一个元素,即计算结果,使用 stack.pop() 来获取这个结果并返回。
print (stack.pop)

"""
这段代码实现了逆波兰表达式(Reverse Polish Notation,RPN)的求值操作。RPN 是一种将运算符置于操作数之后的数学表达式表示法,计算它的值需要使用栈数据结构来操作。

让我逐行解释这段代码的功能:

from operator import add, sub, mul:这里导入了 operator 模块中的加法、减法和乘法运算符,以便在后面的代码中使用。

op_map 是一个字典,将运算符与相应的操作函数关联起来。例如,'+' 对应于加法函数 add,'-' 对应于减法函数 sub,以此类推。这个字典用于在后面的代码中查找和执行运算符对应的操作函数。

evalRPN(self, tokens: List[str]) -> int 方法用于计算逆波兰表达式的值。它接受一个字符串列表 tokens,其中包含了逆波兰表达式的各个元素(操作数和运算符)。

stack = []:创建一个空栈,用于存储操作数。

for token in tokens::遍历输入的逆波兰表达式中的每个元素。

if token not in {'+', '-', '*', '/'}::如果当前元素不是运算符,即它是操作数,那么将其转换为整数并压入栈中。

否则,如果当前元素是运算符,那么从栈中弹出两个操作数(分别是栈顶的两个元素),然后执行与运算符对应的操作函数,将计算结果压入栈中。这里利用了 op_map 字典来查找相应的操作函数,并传递两个操作数给它。

最终,当遍历完所有元素后,栈中应该只剩下一个元素,即计算结果,使用 stack.pop() 来获取这个结果并返回。

这段代码有效地实现了逆波兰表达式的求值操作,利用栈来处理操作数和运算符,并使用操作函数来执行相应的计算。



"""

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值