NYOJ 35 表达式求值

54 篇文章 0 订阅

表达式求值


import java.util.HashMap;
import java.util.Scanner;
import java.util.Stack;
public class Main {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		HashMap<Character,Integer> map=new HashMap<Character,Integer>();//存运算符的优先级
		Stack<Double> sk1=new Stack<Double>();//存数字
		Stack<Character> sk2=new Stack<Character>();//存运算符
		map=SUM(map);
		int N=input.nextInt();
		while(N-->0){
			String s=input.next();
			boolean ok=true;
			int x=0;
			for(int i=0;i<s.length();i++){
				char a=s.charAt(i);
				if((a>='0'&&a<='9'||a=='.')&&ok){
					x=i;
					ok=false;
				}
				else if(!(a>='0'&&a<='9'||a=='.')){//是运算符
					//System.out.println(s.substring(x, i));
					if(i>0&&s.charAt(i-1)<='9'&&s.charAt(i-1)>='0')//防止两个运算符一块,1*(..)
						sk1.push(Double.parseDouble(s.substring(x, i)));//将数字部分变成浮点型
					ok=true;
					if(sk2.isEmpty()){//运算符栈是空,运算符直接进栈
						sk2.push(a);
					}
					else{//运算符栈不为空
						if(map.get(sk2.peek())<map.get(a)){//如果来的运算符优先级较高,直接进栈
							sk2.push(a);
							continue;
						}
						while(!sk2.isEmpty()&&(map.get(sk2.peek())>=map.get(a)&&sk2.peek()!='(')){//运算符栈不为空,且来的运算符级别较低,
							switch(sk2.pop()){//最后进的运算符出栈,执行运算
							case '+':{
								Double c=sk1.pop();//数字栈后进的两个数字出栈开始运算,然后再进栈
								Double d=sk1.pop();
								c=c+d;sk1.push(c);break;
							}
							case '-':{
								Double c=sk1.pop();
								Double d=sk1.pop();
								c=d-c;sk1.push(c);break;
							}
							case '*':{
								Double c=sk1.pop();
								Double d=sk1.pop();
								c=c*d;sk1.push(c);break;
							}
							case '/':{
								Double c=sk1.pop();
								Double d=sk1.pop();
								c=d/c;sk1.push(c);break;
							}
							}
						}
						if(!sk2.isEmpty()&&sk2.peek()=='('&&a==')'){//消除运算之后的无意义括号
							sk2.pop();
						}
						else
							sk2.push(a);//其他来的运算符继续进栈
					}
				}
			}
			System.out.printf("%.2f\n",sk1.pop());
		}
	}

	private static HashMap<Character, Integer> SUM(HashMap<Character, Integer> map) {//运算符优先级
		map.put('=', 1);
		map.put(')', 2);
		map.put('+', 3);
		map.put('-', 3);
		map.put('*', 4);
		map.put('/', 4);
		map.put('(', 5);
		return map;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值