我正在编写一个程序,用于确定用户输入的数学方程式是否具有匹配的括号。我知道右括号的数量是否等于左括号的数量,但用户可以输入2)(3 + x)(4 + x)(6。在这种情况下,我要避免告诉用户他的括号匹配,我想检查一个')'是否出现在'('。
之前'3.enterain.py'
答案 0 :(得分:0)
这里的一般想法是使用堆栈。 当你遇到一个开括号时,把它推到堆栈上 当您遇到右括号时,POP会从堆栈中开始括号的开头括号
答案 1 :(得分:0)
使用堆栈绝对没有必要。只需计算打开多少个括号。如果该计数为负数,则它们不匹配,如果计数结果为正数,则它们不匹配:
def valid_parens(string):
open_count = 0
for char in string:
if char == "(":
open_count += 1
elif char == ")":
open_count -= 1
if open_count < 0:
return False
return open_count == 0
测试用例:
assert valid_parens("((2+2)-4)*2") == True
assert valid_parens(")(2/2)(") == False
assert valid_parens("()()()") == True
assert valid_parens("((())") == False
答案 2 :(得分:0)
尽管问题可以通过堆栈解决,但它有点浪费内存。在正常大小的输入中,这不会是一个问题,但在非常大的序列中,它将成为一个问题。你不需要跟踪parens本身,但只需计算有多少个开放的内存 - 总内存使用量是一个整数,而不是每个paren遇到的堆栈中的一个条目。
def proper_paren(seq):
open_parens = 0
for char in seq:
if char == '(':
open_parens += 1
elif char == ')':
open_parens -= 1
if open_parens < 0:
return False
return open_parens == 0