📜  识别并标记表达式中不匹配的括号(1)

📅  最后修改于: 2023-12-03 15:28:09.484000             🧑  作者: Mango

识别并标记表达式中不匹配的括号

在编写程序时,经常会遇到括号不匹配的情况,例如在if语句、循环语句等中。如果括号不匹配,程序就会出现错误,因此需要及时识别并标记表达式中不匹配的括号。下面是一些方法可以实现这一功能。

方法一:使用栈

栈是一种后进先出(LIFO)的数据结构,可以用来匹配左右括号。具体实现如下:

  1. 定义一个空栈。
  2. 从左向右遍历表达式中的每个字符。
  3. 如果是左括号,则将其推入栈中。
  4. 如果是右括号,则从栈顶取出元素进行匹配。
  5. 如果栈顶元素是左括号,则匹配成功,弹出栈顶元素,继续遍历表达式。
  6. 如果栈顶元素不是左括号,则匹配失败,记录下当前位置,并退出程序。
  7. 如果所有括号都匹配成功,程序执行完毕。

示例代码:

def match_parentheses(expression):
    stack = []
    for i, char in enumerate(expression):
        if char == '(':
            stack.append(i)  
        elif char == ')':
            if stack:
                stack.pop()
            else:
                return i
    if stack:
        return stack.pop()

示例输出:

>>> match_parentheses("((1 + 2) * (3 - 4))")
None
>>> match_parentheses("((1 + 2) * (3 - 4)")
10
>>> match_parentheses("((1 + 2) * (3 - 4)) + (5 * 6")
18
方法二:使用计数器

计数器方法是记录左右括号的个数,从而识别不匹配的括号。具体实现如下:

  1. 定义两个计数器,分别表示左右括号的数量。
  2. 从左向右遍历表达式中的每个字符。
  3. 如果是左括号,则左括号数量+1。
  4. 如果是右括号,则右括号数量+1。
  5. 如果在遍历时,右括号数量大于左括号数量,则表明有括号不匹配,记录下当前位置,并退出程序。
  6. 如果遍历完表达式后,左括号数量不等于右括号数量,则表明有括号不匹配,记录下当前位置,并退出程序。
  7. 如果所有括号都匹配成功,程序执行完毕。

示例代码:

def match_parentheses(expression):
    left = right = 0
    for i, char in enumerate(expression):
        if char == '(':
            left += 1
        elif char == ')':
            right += 1
            if right > left:
                return i
    if left != right:
        return len(expression) - 1

示例输出:

>>> match_parentheses("((1 + 2) * (3 - 4))")
None
>>> match_parentheses("((1 + 2) * (3 - 4)")
10
>>> match_parentheses("((1 + 2) * (3 - 4)) + (5 * 6")
18
总结

以上两种方法都可以实现识别并标记表达式中不匹配的括号的功能。使用栈的方法可以处理多种不同类型的括号(例如方括号、大括号等),但是需要使用额外的空间来保存栈。使用计数器的方法则更为简单,但只能处理单一类型的括号。对于表达式中包含多种类型的括号,我们可以根据需要选择方法。