算法—表达式合法判断

题目

写一段代码,判断一个包括’{’,’[’,’(’,’)’,’]’,’}'的表达式是否合法(注意看样例的合法规则。)
可以看到一个合法的表达式,左括号和右括号必须相互对应。
给定一个表达式A,请返回一个bool值,代表它是否合法。

测试样例1:
“[a+b*(5-4)]{x+b+b(({1+2}))}”
返回:true

分析

此题判断表达式是否合法只需判断括号是否对应即可。

判断几种括号是否都相互对应了,设置三个变量:leftnum1, leftnum2, leftnum3,分别记录 ‘{’, ‘[’, ‘(’ 的数量,当遇到左括号时,对应的变量加一,遇到对应的右括号时,对应的变量减一。最后如果三个变量值都为0,则说明表达式合法。

代码

import java.util.*;

public class ChkExpression {
    public boolean chkLegal(String A) {
        int leftnum1 = 0; //记录'{'的数目
        int leftnum2 = 0; //记录'['的数目
        int leftnum3 = 0; //记录'('的数目
        for(int i=0; i<A.length(); i++){
            switch(A.charAt(i)){
                case('{'):
                    leftnum1++;
                    continue;
                case('['):
                    leftnum2++;
                    continue;
                case('('):
                    leftnum3++;
                    continue;
                case('}'):
                    leftnum1--;
                    continue;
                case(']'):
                    leftnum2--;
                    continue;
                case(')'):
                    leftnum3--;
                    continue;
                default:
                    continue;
            }
        }
        if(leftnum1==0 && leftnum2==0 && leftnum3==0){
            return true;
        }
        return false;
    }
}

运行结果

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用算符优先分析算法判断表达式是否合法的C++代码示例: ```c++ #include <iostream> #include <stack> #include <string> using namespace std; // 定义运算符的优先级 int getPriority(char op) { if (op == '*' || op == '/') return 2; else if (op == '+' || op == '-') return 1; else return 0; } // 判断字符是否为运算符 bool isOperator(char ch) { return (ch == '+' || ch == '-' || ch == '*' || ch == '/'); } // 判断表达式是否合法 bool isValidExpression(string expression) { stack<char> opStack; int i = 0; while (i < expression.length()) { char ch = expression[i]; if (ch == '(') opStack.push(ch); else if (ch == ')') { if (opStack.empty() || opStack.top() != '(') return false; opStack.pop(); } else if (isOperator(ch)) { if (opStack.empty() || getPriority(ch) > getPriority(opStack.top())) opStack.push(ch); else { while (!opStack.empty() && getPriority(ch) <= getPriority(opStack.top())) { opStack.pop(); } opStack.push(ch); } } i++; } return opStack.empty(); } int main() { string exp1 = "2+3*4"; string exp2 = "(2+3)*4"; string exp3 = "2+3*(4+5)"; string exp4 = "2+3*4)"; string exp5 = "2+3*4("; cout << exp1 << " is " << (isValidExpression(exp1) ? "valid" : "invalid") << endl; cout << exp2 << " is " << (isValidExpression(exp2) ? "valid" : "invalid") << endl; cout << exp3 << " is " << (isValidExpression(exp3) ? "valid" : "invalid") << endl; cout << exp4 << " is " << (isValidExpression(exp4) ? "valid" : "invalid") << endl; cout << exp5 << " is " << (isValidExpression(exp5) ? "valid" : "invalid") << endl; return 0; } ``` 该程序中,我们使用了一个操作符栈来存储运算符,遇到左括号时将其压入栈中,遇到右括号时将栈中的元素弹出直到遇到左括号。如果栈为空或栈顶的运算符优先级低于当前运算符,则将当前运算符压入栈中;否则,将栈中的运算符弹出直到栈为空或栈顶的运算符优先级低于当前运算符,然后将当前运算符压入栈中。最后,如果操作符栈为空,则表达式合法,否则表达式合法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值