nyoj35 表达式求值(栈)

表达式求值

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 4
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=
样例输出
1.50
4.00
来源
数据结构课本例题改进
上传者
张云聪

以前碰到过这道题一直不想做。。。

今天学了数据结构看到了运算符优先级表 就做做。。。

nyoj35 表达式求值(栈)_第1张图片


import java.util.*;
public class Main {
	public static void main(String args[]){
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		while(n--!=0){
			char []str=scanner.next().toCharArray();
			cal(str);
		}
	}
	private static void cal(char[] str){
		char []temp = new char[100];
		Stack<Character> optr=new Stack<Character>();
		Stack<Double> opnd=new Stack<Double>();
		int k=0;
		optr.clear();
		opnd.clear();
		optr.add('=');
		for(int i=0;i<str.length;){
			if(Character.isDigit(str[i])||str[i]=='.'){
				temp[k++]=str[i];
				i++;
				continue;
			}
			if(k!=0){
				opnd.add(Double.parseDouble(new String(temp,0,k)));
				k=0;
			}
			switch(compare(optr.peek(),str[i])){
			case 60:
				optr.add(str[i]);i++;break;
			case 61:
				optr.pop();i++;break;
			case 62:
				opnd.add(result(opnd.pop(),opnd.pop(),optr.pop()));
				break;
			}
		}
		System.out.printf("%.2f\n",opnd.pop());
	}
	private static Double result(Double num1, Double num2, char ch) {//计算
		// TODO Auto-generated method stub
		if(ch=='+')
			return num2+num1;
		if(ch=='-')
			return num2-num1;
		if(ch=='*')
			return num2*num1;
		if(ch=='/')
			return num2/num1;
		return null;
	}
	private static int compare(char ch1,char ch2){//返回运算符间关系
		String oper[]={">><<<>>",">><<<>>",">>>><>>",
				">>>><>>","<<<<<= ",">>>> >>","<<<<< ="};
		int x,y;
		x=to_num(ch1);
		y=to_num(ch2);
		return (int)(oper[x].charAt(y));
		
	}
	private static int to_num(char ch) {
		if(ch=='+')
			return 0;
		else if(ch=='-')
			return 1;
		else if(ch=='*')
			return 2;
		else if(ch=='/')
			return 3;
		else if(ch=='(')
			return 4;
		else if(ch==')')
			return 5;
		else if(ch=='=')
			return 6;
		else 
		return -1;
	}
}


你可能感兴趣的:(栈,表达式求值,nyoj35)