给定一个不完整的表达式,补全其左括号

问题描述

编写一道程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。例如,给定输入:
1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
你的程序应该输出:
((1 + 2) * ((3 - 4) * (5 - 6)))


解决思路

如果不了解Dijkstra双栈算术表达式求值算法,建议先去了解一下,本问题就是根据这个算法中的双栈的思想来解决问题的。

步骤:

1.输入指定字符串,每次读取一个字符串

2.对读取的字符串进行判断操作,是数值就放入操作数栈中,是运算符就放入运算符栈中

3.当读取到的是")"右括号时,弹出两个操作数和弹出一个运算符进行字符串拼接,最后将拼成的字符串在push到操作数栈中

4.最终的结果就在操作数栈中,pop就行


行为轨迹

这里的栈我横着表示,例如:

1 2 3 4 5 6 :1是栈底,6是栈顶

输入输出操作数栈运算符栈
11
+1+
21 2+
)(1+2)
*(1+2)*
3(1+2) 3*
-(1+2) 3* -
4(1+2) 3 4* -
)(1+2) (3-4)*
*(1+2) (3-4)* *
5(1+2) (3-4) 5* *
-(1+2) (3-4) 5* * -
6(1+2) (3-4) 5 6* * -
)(1+2) (3-4) (5-6)* *
)(1+2) ((3-4)*(5-6))*
)((1 + 2) * ((3 - 4) * (5 - 6)))
((1 + 2) * ((3 - 4) * (5 - 6)))

具体代码

需导入algs4.jar,百度一下就可以找到

/**
 *  补全左括号
 *  输入:1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
 *  输出:( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )
 */
public class test {
    public static void main(String[] args) {
        Stack<String> ops = new Stack<String>();
        Stack<String> vals = new Stack<String>();
        while(!StdIn.isEmpty()){
            String s = StdIn.readString();
            if(s.equals("*")) ops.push(s);
            else if(s.equals("+")) ops.push(s);
            else if(s.equals("-")) ops.push(s);
            else if(s.equals("/")) ops.push(s);
            else if(s.equals(")")) {
                String s1 =vals.pop();
                String sum="("+vals.pop()+ops.pop()+s1+")";
                vals.push(sum);
            }else{
                vals.push(s);
            }
        }
        System.out.println(vals.pop());
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值