这是一个简单的四则运算计算器,不支持括号,没有做乘法的越界计算和除0等异常处理。
只是简单的描述一个四则运算过程。
package SortSet;
import java.util.Stack;
public class OperationTest {
private static Stack<Character> opeStack = new Stack<Character>();
private static Stack<Integer> numStack = new Stack<Integer>();
private static StringBuilder in = new StringBuilder();
private static StringBuilder number = new StringBuilder();
public static void main(String[] args) {
System.out.println(cal("4-6*8-5+2*11"));
}
public static int cal(String input) {
in.append(input);
while (in.length() > 0) {
char temp = in.charAt(0);
in.delete(0, 1);
if (temp > '0' && temp < '9') {
number.append(temp);
} else {
if (!"".equals(number.toString())) {
int num = Integer.parseInt(number.toString());
numStack.push(num);
number.delete(0, number.length());
}
while (!opeStack.isEmpty() && !compare(temp)) {
int num2 = numStack.pop();
int num1 = numStack.pop();
char ope = opeStack.pop();
cal0(ope,num1,num2);
}
opeStack.push(temp);
}
}
if(number.length()>0){
int num = Integer.parseInt(number.toString());
numStack.push(num);
}
while(!opeStack.isEmpty()){
int num2= numStack.pop();
int num1= numStack.pop();
cal0(opeStack.pop(),num1,num2);
}
return numStack.pop();
}
public static void cal0(char ope,int num1 ,int num2){
switch (ope) {
case '+':
numStack.push(num1 + num2);
break;
case '-':
numStack.push(num1 - num2);
break;
case '*':
numStack.push(num1 * num2);
break;
case '/':
numStack.push(num1 / num2);
break;
}
}
public static boolean compare(char operation) {
if (opeStack.isEmpty())
return true;
char last = opeStack.peek();
switch (operation) {
case '+':
return false;
case '-':
return false;
case '*':
if (last == '+' || last == '-')
return true;
return false;
case '/':
if (last == '+' || last == '-')
return true;
return false;
}
return true;
}
}
执行结果为:
-27
说明:这里乘法问题需要考虑越界,最好用大整数得结果。另外除法也需要考虑除0异常。 这里采用StringBuilder减少了创建String的开销。 算法过程为将操作数压入操作栈,如果当前操作符优先级低于栈顶优先级,则计算,否则压入操作符栈。当最终计算式遍历完时,进行运算即可。