栈应用_四则运算

题目

输入字符串格式的算术表达式,如: “3+2*{1+2*[-4/(8-6)+7]}”;输出去结果。

思路

栈的应用;
四则运算分为下列四个过程

  1. 读取字符串 (并不是简单地读入,比如 当字符串中有两位数,例如12时,我们应该读成 “12”而不是“1”,“2”,不然运算会出现错误)。
  2. 处理字符串,给字符串加0 (为了保证后缀运算的正常运行,需要对出现的负数进行考虑。 例如 (-4 + 3) 为了运算正确,将其处理成(0 - 4 +3))
  3. 将中缀表达式转化成后缀表达式
  4. 计算后缀表达式

代码

public class Main {
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        String s = sc.nextLine();
        // 将各种括号统一替换成小括号
        s = s.replaceAll("\\{","(");
        s = s.replaceAll("\\[","(");
        s = s.replaceAll("\\}",")");
        s = s.replaceAll("\\]",")");

        char[] chars = s.toCharArray();
        // 读取字符串
        List<String> all = new ArrayList<>();

        int len = s.length();
        int i=0;
        while(i<len){
            int offset = 0;
            while(i+offset<len && (chars[i+offset]>='0'&&chars[i+offset]<='9')){
                offset++;
            }
            if(offset != 0){
                all.add(String.valueOf(chars,i,offset));
                i+=offset;
            }else{
                all.add(String.valueOf(chars,i,1));
                i++;
            }
        }

        // 给字符串加 0
        List<String> list = new ArrayList<>();
        for(int j=0; j<all.size(); j++){
            if(all.get(j).equals("-")){
                if(j == 0){
                   list.add("0");
                }else{
                    if(all.get(j-1).equals("(")){
                        list.add("0");
                    }
                }
            }
            list.add(all.get(j));
        }
        List<String> postExpre = getPostExpre(list);
        System.out.println(caculate(postExpre));

    }
    // 将中缀表达式转为后缀表达式
    public static List<String> getPostExpre(List<String> list){
    	//存数字
        List<String> post = new ArrayList<>();
        // 存操作符
        Stack<String> ops = new Stack<>();

        int len = list.size();
        for(int i=0; i<len; i++){
            String tmp = list.get(i);
            // 非数字的情况,直接加入链表
            if(!tmp.equals("(")&&!tmp.equals(")")&&!tmp.equals("+")&&!tmp.equals("-")&&
                    !tmp.equals("*")&&!tmp.equals("/")){
                post.add(tmp);
                // 左括号 乘除 直接加入操作符栈
            }else if(tmp.equals("(") || tmp.equals("*") || tmp.equals("/")){
                ops.push(tmp);
               // 遇见右括号,将前面直到左括号的弹出,左括号也要弹出
            }else if(tmp.equals(")")){
                for(int j=ops.size()-1; j>=0; j--){
                    String ch = ops.pop();
                    if(!ch.equals("(")){
                        post.add(ch);
                    }else{
                        break;
                    }
                }
            }else if(tmp.equals("+") || tmp.equals("-")){
                if(ops.size()==0 || ops.size()>1&&ops.get(ops.size()-1).equals("(")){
                    ops.push(tmp);
                }else{
                    for(int j=ops.size()-1; j>=0; j--){
                        // 左括号不需要弹出
                        String ch = ops.get(j);
                        if(!ch.equals("(")){
                            post.add(ops.pop());
                        }else{
                            break;
                        }
                    }
                    ops.push(tmp);
                }
            }
        }
        for(int j=ops.size()-1; j>=0; j--){
            post.add(ops.pop());
        }
        return post;
    }

    // 计算后缀表达式
    public static int caculate(List<String> post){
    	// 运算结果栈
        Stack<Integer> vals = new Stack<>();
        // 操作符栈
        Stack<String> ops = new Stack<>();

        int len = post.size();
        for(int i=0; i<len; i++){
            String tmp = post.get(i);
            if(!tmp.equals("+")&&!tmp.equals("-")&&!tmp.equals("*")&&!tmp.equals("/")){
                vals.push(Integer.parseInt(tmp));
            }else{
                int val = 0;
                int n1 = vals.pop();
                int n2 = vals.pop();
                if(tmp.equals("+")){
                    val = n2+n1;
                }else if(tmp.equals("-")){
                    val = n2-n1;
                }else if(tmp.equals("*")){
                    val = n2*n1;
                }else if(tmp.equals("/")){
                    val = n2/n1;
                }
                vals.push(val);
            }
        }
        return vals.pop();

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值