- package stack.rpn;
- import stack.ALStack;
- /**
- * 计算RPN的值
- * @author Kyle
- * @version 1.0
- */
- public class CalcRPN {
- public static void main(String[] arg) {
- System.out.println("2 5 3 * +的计算结果为:" + calc("20 5 3 * +"));
- System.out.println("2 5 + 3 * +的计算结果为:" + calc("2 5 + 3 *"));
- }
- /**
- * 计算后缀表达是的值,目前只支持整数
- *
- * @return
- */
- private static int calc(String exp) {
- ALStack<Integer> calcStack = new ALStack<Integer>();// 数字堆栈
- StringBuffer noBuf = new StringBuffer();// 数字数组
- for (int i = 0; i < exp.length(); i++) {
- char ch = exp.charAt(i);
- if (Character.isDigit(ch)) {// 检查是否是数字
- noBuf.append(ch);
- } else if (Character.isSpaceChar(ch)
- && !noBuf.toString().equals("")) {// 是否是空格
- calcStack.push(Integer.parseInt(noBuf.toString()));// 解析将数字放入堆栈
- noBuf = new StringBuffer();
- } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') { // 判断是否是运算符
- int right = calcStack.pop();// 弹出右操作数
- int left = calcStack.pop();// 弹出左操作数
- int val = 0;// 计算的中间值
- switch (ch) {
- case '+':
- val = right + left;
- break;
- case '-':
- val = right - left;
- break;
- case '*':
- val = right * left;
- break;
- case '/':
- val = right / left;
- break;
- }
- calcStack.push(val); // 将计算数据放入堆栈中
- }
- }
- return calcStack.pop();// 返回最后一个数据
- }
- }
求解后缀表达式(RPN)
最新推荐文章于 2021-02-04 23:40:20 发布