问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
import java.awt.Shape;
import java.awt.Stroke;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class 表达式运算 {
/**
* @param args
*/
//中缀表达式转后缀表达式所用的栈
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
String string = scanner.next();
//1+((23+34)*5)-6
ArrayList<Character> stack1 = new ArrayList<Character>();
ArrayList<Character> stack2 = new ArrayList<Character>();
//转后缀
for (int i = 0; i <string.length(); i++) {
char s = string.charAt(i);
char ss = 0;
if (s>='0'&&s<='9') {
stack1.add(s);
if (i==string.length()-1) {
ss = string.charAt(i);
}else {
ss=string.charAt(i+1);
}
if (ss>='0'&&ss<='9') {
continue;
}else {
stack1.add('#');
}
}else {
if (s==')') {
//那么就进行消运算符,加到数字里面去
for (int j = stack2.size()-1; j>=0; j--) {
if (stack2.get(j)=='('){
//移除stack2中的括号中间的元素包括括号
for (int j2 = stack2.size()-1; j2>=j; j2--) {
stack2.remove(j2);
}
break;
}else {
//括号中间的符号加入到stack1中
stack1.add(stack2.get(j));
stack1.add('#');
}
}
}else{
char sss=0;
if (stack2.size()>0) {
sss = stack2.get(stack2.size()-1);
if (panduan(s,sss)) {
//判断符号运算及
stack1.add(sss);
stack1.add('#');
stack2.remove(stack2.size()-1);
stack2.add(s);
}else {
stack2.add(s);
}
}else {
stack2.add(s);
}
}
}
}
//1 # 2 3 # 3 4 # + 5 # * + 6 # -
//处理stack2中剩余字符
for (int j = stack2.size()-1; j >=0; j--) {
if (stack1.get(stack1.size()-1)=='#') {
stack1.add(stack2.get(j));
}else {
stack1.add('#');
stack1.add(stack2.get(j));
}
}
//进行算数处理
//储存数字
ArrayList<Double> list = new ArrayList<Double>();
//储存字符串
String chuli = "";
//把stack1数组转为字符串
for (int j = 0; j <stack1.size(); j++) {
chuli+=stack1.get(j);
}
//以#分隔
String str[]=chuli.split("#");
for (int i = 0; i < str.length; i++) {
//计算
if (str[i].equals("+")||str[i].equals("-")||str[i].equals("/")||str[i].equals("*")) {
//取出后两个数
Double num1 = list.get(list.size()-1);
Double num2 = list.get(list.size()-2);
if (str[i].equals("+")) {
list.set(list.size()-2, num2+num1);
list.remove(list.size()-1);
}else if (str[i].equals("-")) {
list.set(list.size()-2, num2-num1);
list.remove(list.size()-1);
}else if (str[i].equals("*")) {
list.set(list.size()-2, num2*num1);
list.remove(list.size()-1);
}else if (str[i].equals("/")) {
list.set(list.size()-2, num2/num1);
list.remove(list.size()-1);
}
}else {
list.add(Double.parseDouble(str[i])); //如果为数字就存到数组中间去
}
}
//算到最后只剩下最后一个数字了,那就是答案,直接输出
System.out.println(list.get(0));
}
//判断符号优先级
public static boolean panduan(char a,char b){
if ((a=='+'&&b=='-')
||(a=='*'&&b=='/')
||(a=='-'&&b=='+')
||(a=='/'&&b=='*')){
return true;
}else if((a=='+'&&(b=='*'||b=='/'))
||(a=='-'&&(b=='*'||b=='/'))){
return true;
}
return false;
}
}