问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
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; } }