利用栈,实现简单计算器功能
计算的数中 不能带括号.每行代码的功能,里面都备注的很清楚了
import java.util.Stack;
public class Calculator {
public static void main(String[] args) {
String s = "143+42+12*70-21+50";
Stack<Character> operStack = new Stack<>();
Stack<Integer> numStack = new Stack<>();
int index = 0;
String num = "";
int num1, num2;
while (true) {
//利用循环一次一次的 从字符串中取
char c = s.charAt(index);
if (isOper(c)) {
//如果c是运算符的话,执行这里
if (operStack.isEmpty()) {
//判断运算符栈是否为空,为空的话直接把运算符加进去就好
operStack.push(c);
} else {
//如果是运算符判断运算符的优先级
if (priority(c) <= priority(operStack.peek())) {
//如果该运算符 的优先级 小于或等于 栈顶元素的优先级
//取出两个数字栈中的数据 和 一个运算符栈中的数据 进行运算
//让后将运算结果 加入到数字栈中,将这个运算符加入到运算符栈中
num1 = numStack.pop();
num2 = numStack.pop();
numStack.push(cal(num1, num2, operStack.pop()));
operStack.push(c);
} else {
operStack.push(c);
}
}
} else {
//如果c不是运算符的话执行这里
num += c;
//如果是多位数的话,需要判断数的位数
if (index == s.length() - 1) {
numStack.push(Integer.parseInt(num));
num = "";
} else {
//判断这个数字的下一个是不是 字符,如果是就把前面的字符 就把前面的数字加入到数字栈中
if (isOper(s.charAt(index + 1))) {
numStack.push(Integer.parseInt(num));
num = "";
}
}
}
index++;
if (index >= s.length()) {
break;
}
}
//将所有的 字符都入栈之后,进行计算
//运算结束的条件(满足其中之一就可以)
//1.数字栈中只剩下一个数字
//2.运算符栈中没有运算符
while (!operStack.isEmpty()) {
num1 = numStack.pop();
num2 = numStack.pop();
numStack.push(cal(num1, num2, operStack.pop()));
}
System.out.printf("%s的运算结果为:%d", s, numStack.pop());
}
//判断是不是运算符
static boolean isOper(char c) {
if (c == '+' || c == '-' || c == '*' || c == '/' || c == 'x') {
return true;
}
return false;
}
//判断运算符的优先级
static int priority(char c) {
if (c == '*' || c == '/' || c == 'x') {
return 1;
} else if (c == '+' || c == '-') {
return 0;
} else {
return -1;
}
}
//算数运算
static int cal(int x, int y, char oper) {
switch (oper) {
case '+':
return x + y;
case '-':
return y - x;
case '*':
case 'x':
return x * y;
case '/':
return y / x;
default:
return -1;
}
}
}
如果想看更复杂的计算器,请看我的其它文章.