📜  门| GATE CS 2021 |设置1 |问题30(1)

📅  最后修改于: 2023-12-03 14:58:22.227000             🧑  作者: Mango

题目介绍

本题是2021年门考(GATE)计算机科学及相关专业的第一道编程题,编号为问题30。该题主要考察了解字符串处理和递归算法的能力。

题目要求

题目要求实现一个函数 is_valid_expression(expression),接收一个表示算术表达式的字符串作为参数,判断该表达式是否合法。其中,表达式中允许包含以下符号:

  • 小括号 '(' 和 ')',表示括号内的表达式优先计算;
  • 运算符 '+', '-', '*' 和 '/' 用来计算表达式中的算数运算;
  • 数字 0 到 9 表示常量。

实现思路

该算法可以通过递归实现,主要分为以下几步:

  1. 检查字符串是否为空,如果是则表达式无效,返回 False;
  2. 检查字符串是否只包含数字和算术符号,如果不是则表达式无效,返回 False;
  3. 检查表达式是否只包含一个数字,如果是则表达式有效,返回 True;
  4. 若表达式包含括号,则需要递归处理括号内的表达式并计算出结果;
  5. 若表达式不包含括号,则按照运算符的优先级计算表达式。

代码实现

以下是 Python 代码实现示例:

def is_valid_expression(expression):
    # 1. 检查字符串是否为空
    if not expression:
        return False

    # 2. 检查字符串是否只包含数字和算术符号
    for char in expression:
        if not char.isdigit() and char not in ['+', '-', '*', '/', '(', ')']:
            return False

    # 3. 检查表达式是否只包含一个数字
    if expression.isdigit():
        return True

    # 4. 递归处理表达式中的子表达式
    stack = []
    for i in range(len(expression)):
        if expression[i] == '(':
            stack.append(i)
        elif expression[i] == ')':
            start = stack.pop()
            if not is_valid_expression(expression[start+1:i]):
                return False

    # 5. 计算表达式中的算数运算
    index = len(expression) - 1
    while index >= 0:
        if expression[index] in ['+', '-', '*', '/']:
            left_exp = expression[:index]
            right_exp = expression[index+1:]

            if not is_valid_expression(left_exp) or not is_valid_expression(right_exp):
                return False

            break
        index -= 1
    else:
        return False

    return True

其中,第4步使用了栈的数据结构来处理括号,第5步的计算方法可以根据具体需求进行修改。