原题链接:https://leetcode-cn.com/problems/basic-calculator-ii
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
解题思路:首先根绝已有中缀表达式转换为后缀表达式,之后再根据后缀表达式求值即可。
1.转化为后缀表达式
首先准备一个栈用来储存字符,另一个链表存储后缀表达式。遇到数字直接放到表达式中,遇到字符的时候,如果栈空则入栈,不空的话和栈顶比较,将大于等于该字符的内容出栈并存到表达式中。
2.后缀表达式求值
这个比较容易,数字入栈,遇到字符计算即可。
源码如下:
public int calculate(String s) { LinkedList<String> houzhui = new LinkedList<>(); //后缀表达式栈 Stack<Character> charStack = new Stack<>(); int start = 0; for(int i=0; i<s.length();i++) { char c = s.charAt(i); if (c=='+'||c=='-'||c=='*'||c=='/') { houzhui.add(s.substring(start,i).trim()); start=i+1; if(!charStack.isEmpty()&&(c=='*'||c=='/')){ while(!charStack.isEmpty()&&(charStack.peek()=='*'||charStack.peek()=='/')) houzhui.add(charStack.pop().toString()); } if(!charStack.isEmpty()&&(c=='+'||c=='-')){ while (!charStack.isEmpty()) houzhui.add(charStack.pop().toString()); } charStack.add(c); } } houzhui.add(s.substring(start,s.length()).trim()); while (charStack.size() > 0) { houzhui.add(charStack.pop().toString()); } //后缀表达式生成完毕 Stack<Integer> numStack = new Stack<>(); while (houzhui.size()>0){ if(houzhui.peekFirst().equals("+")){ int t2 =numStack.pop(); int t1 =numStack.pop(); numStack.add(t1+t2); houzhui.pollFirst(); } else if(houzhui.peekFirst().equals("-")){ int t2 =numStack.pop(); int t1 =numStack.pop(); System.out.println(t1+" "+t2); numStack.add(t1-t2); houzhui.pollFirst(); } else if(houzhui.peekFirst().equals("*")){ int t2 =numStack.pop(); int t1 =numStack.pop(); numStack.add(t1*t2); houzhui.pollFirst(); } else if(houzhui.peekFirst().equals("/")){ int t2 =numStack.pop(); int t1 =numStack.pop(); numStack.add(t1/t2); houzhui.pollFirst(); }else { numStack.add(Integer.parseInt(houzhui.pollFirst())); } } return numStack.peek(); }