时间:2021/03/12
一.题目描述
对于一个不存在括号的表达式进行计算
输入描述
存在多种数据,每组数据一行,表达式不存在空格
输出描述
输出结果
题目链接
https://www.nowcoder.com/practice/7b18aa6b7cc14f8eaae6b8acdebf890b?
tpId=40&tqId=21433&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey
二.算法
题解
首先要定义运算符的优先级,这里使用的是HashMap来存放优先级,然后创建两个栈分别存放数字和运算符,再读取输入,在读入的字符串后面添加一个美元符号作为字符串的结束,并且给结束符最低的优先级。在读入时,若当前字符为数字,则直接放入数字栈中;若读入的是运算符,则先判断当前运算符栈是否为空,若为空则直接存入运算符栈中,若不为空,则比较当前字符与运算符栈顶运算的优先级,当当前字符的优先级大于栈顶字符优先级时存入直接存入运算符栈中,若相等或者小于则进行运算,将栈顶运算符出栈,然后将数字栈中从栈顶出栈两个数字(要注意区分顺序),判断运算符的种类后进行运算。一直到当前运算符的优先级大于运算符栈顶元素的优先级时停止运算,将当前运算符放入运算符栈的栈顶。要注意使用Stack类的peek方法和pop方法时要确保栈中存在元素,否则会返回越界的错误。
代码
import java.util.Scanner; import java.util.Stack; import java.util.HashMap; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); HashMap<Character, Integer> map = new HashMap<>(); //定义运算符优先级 map.put('$', 0); map.put('+', 1); map.put('-', 1); map.put('*', 2); map.put('/', 2); while(in.hasNext()){ //读取输入 char[] ch = (in.nextLine() + "$").toCharArray(); //创建数字栈和符号栈 Stack<Float> num = new Stack<>(); //数字栈 Stack<Character> sym = new Stack<>(); //符号栈 //计算表达式 int i = 0; while(i < ch.length){ //如果当前字符入数字,进栈 if(ch[i] >= '0' && ch[i] <= '9'){ float res = 0; while(ch[i] >= '0' && ch[i] <= '9'){ res = res * 10 + (ch[i] - '0'); i++; } num.push(res); }else{ if(!sym.empty()){ if(map.get(sym.peek()) < map.get(ch[i])){ sym.push(ch[i++]); }else{ char c = sym.pop(); float num2 = num.pop(); float num1 = num.pop(); float count = 0; if(c == '+'){ count = num1 + num2; }else if(c == '-'){ count = num1 - num2; }else if(c == '*'){ count = num1 * num2; }else if(c == '/'){ count = num1 / num2; } num.push(count); //sym.push(ch[i]); } }else{ sym.push(ch[i++]); } } } System.out.println(Math.round(num.pop())); //num.pop(); sym.pop(); } in.close(); } }