表达式计算

问题描述

  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
 
  使用两个stack进行中缀表达式求解,一个存符号,一个放数据,数值可能是两位数或者多位数的,
需要进行一些简单的处理,
注意:当下一个运算符优先级大于栈顶符号的优先级时直接入栈,否则进行把栈顶运算符进行出栈,和
数据进行计算,在计算时,两个操作数需要交换位置。java中stack栈顶元素是firstElement
 
import java.lang.reflect.Array;
import java.util.*;

public class Main {
    private Scanner scanner;
    public static void main(String[] args) {
        new Main();
    }

    private Main(){
        scanner = new Scanner(System.in);
        solve();

    }

    private void solve(){
        String s = scanner.next();
        char [] ch = s.toCharArray();

        Stack<Integer> num = new Stack<>();
        Stack<Character> op = new Stack<>();
        int sum = 0;
        for(int i = 0;i<s.length();i++){
            if(Character.isDigit(ch[i])){
                StringBuffer buffer = new StringBuffer();
                i = index(ch,i,buffer)-1;
                num.push(Integer.parseInt(buffer.toString()));
            }
            else {
                if(ch[i] == '('){
                    op.push(ch[i]);
                }
                else if(ch[i] == ')'){
                    while (op.lastElement()!='('){
                        int a = num.pop();
                        int b = num.pop();
                        char sy = op.pop();
                        sum = computer(sy,b,a);
                        num.push(sum);
                    }
                    op.pop();
                }
                else {
                    if(op.empty()){
                        op.push(ch[i]);
                    }
                    else if(prior(ch[i])>prior(op.lastElement())){
                        op.push(ch[i]);
                    }
                    else {
                        int a = num.pop();
                        int b = num.pop();
                        char sy = op.pop();
                        sum = computer(sy,b,a);
                        num.push(sum);
                        op.push(ch[i]);
                    }
                }
            }
        }
        while (!op.empty()){
            int a = num.pop();
            int b = num.pop();
            char sy = op.pop();
            sum = computer(sy,b,a);
            num.push(sum);
        }
        System.out.println(num.firstElement());
    }

    private int computer(char s,int a,int b){
        switch (s){
            case '+':
                return a+b;
            case '-':
                return a-b;
            case '*':
                return a*b;
            case '/':
                return a/b;
        }
        return 0;
    }
    private int prior(char ch){
        int x = 0;
        switch (ch){
            case '+' :
            case '-' :
                x=1;
                break;
            case '*' :
            case '/' :
                x = 2;
                break;
        }
        return x;
    }

    private int index(char []ch,int i,StringBuffer buffer){
        while (Character.isDigit(ch[i])){
            buffer.append(ch[i]);
            i++;
        }
        return i;
    }
}
原文地址:https://www.cnblogs.com/zhanghaijie/p/8545684.html