算法(第四版)1.3.9 补全中序表达式左括号

本文介绍了一种处理中缀表达式的算法,通过使用两个栈分别存储数值和操作符,实现了对输入字符串中缺少的左括号进行正确补充。算法详细步骤包括:构造两个栈,遍历输入字符串,区分数值与操作符,遇到右括号时进行运算并重新入栈,最终返回处理后的表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 0.构造两个Stack vals和ops 分别存放数值和操作符
 * 1.遍历输入字符串
 * 2.如果是数值push到vals
 * 3.如果是操作符push到ops
 * 4.如果是右括号: 拼接 "("+vals.pop()+ops.pop()+vals.pop()+")",然后把整个结果push到vals
 * 5.循环2/3/4步骤直到遍历结束
 * 6.vals.pop()即最后结果
 *
 */
public class InfixAddLeftBracket {

    private static final String LEFT_PAREN = "(";
    private static final String RIGHT_PAREN = ")";

    public static String addLeftBracket(String input) {
        Stack<String> ops = new Stack<>();
        Stack<String> vals = new Stack<>();
        String val = "";//拼接数值
        for (String s : input.trim().split("")) {
            if(s.equals(RIGHT_PAREN)){
                if(!val.equals("")){
                    vals.push(val);
                    val = "";
                }
                String val1 = vals.pop();
                String val2 = vals.pop();
                String result = LEFT_PAREN + val2 + ops.pop() + val1 + RIGHT_PAREN;
                vals.push(result);
            }else if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){
                if(!val.equals("")){
                    vals.push(val);
                    val = "";
                }
                ops.push(s);
            }else{
                val += s;
            }
        }
        return vals.pop();
    }

    public static void main(String[] args) {
        String str1 = "1+2)*3-4)*5-6)))";
        String str2 = "11+2.1)*3-4)*5-6)))";
        System.out.println(addLeftBracket(str1));
        System.out.println(addLeftBracket(str2));
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值