zoukankan      html  css  js  c++  java
  • 表达式求值(java)

    今天去面试,考了这个,短时间没想出来。。。

    太笨了!

    后来想用栈和递归做

    但是看了网上才知道,可以将中缀表达式转为后缀表达式,就极其方便了。

    import java.util.Scanner;
    import java.util.Stack;
    
    public class ExpressionCalc {
    
        private Stack<Character> cStack = new Stack<Character>();
        private Stack<Integer> iStack = new Stack<Integer>();
    
        // 符号等级
        static int cLevel(char c) {
            switch (c) {
            case '(':
                return 0;
            case '+':
                return 1;
            case '-':
                return 1;
            case '*':
                return 2;
            case '/':
                return 2;
            }
            return 0;
        }
    
        // 对栈进行运算
        private void dealStack() {
            char c = cStack.pop();
            int num1 = iStack.pop();
            int num2 = iStack.pop();
            switch (c) {
            case '+':
                iStack.push(num1 + num2);
                break;
            case '-':
                iStack.push(num1 - num2);
                break;
            case '*':
                iStack.push(num1 * num2);
                break;
            case '/':
                iStack.push(num1 / num2);
                break;
            }
        }
    
        // 返回str的表达式的值
        public int calc(char[] exp) {
            while (!cStack.isEmpty()) {
                cStack.pop();
            }
            while (!iStack.isEmpty()) {
                cStack.pop();
            }
            cStack.push('(');
    
            for (int i = 0; i < exp.length; i++) {
                if (exp[i] == ' ') {
                    continue;
                } else if (exp[i] > '0' && exp[i] <= '9') {
                    int num = exp[i] - '0';
                    while (exp[i + 1] > '0' && exp[i + 1] < '9') {
                        i++;
                        num = num * 10 + exp[i] - '0';
                    }
                    iStack.push(num);
                } else if (exp[i] == '(') {
                    cStack.push(exp[i]);
                } else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {
                    while (cLevel(exp[i]) < cLevel(cStack.peek())) {
                        dealStack();
                    }
                    cStack.push(exp[i]);
                } else if (exp[i] == ')') {
                    while (!cStack.peek().equals('(')) {
                        dealStack();
                    }
                    cStack.pop();
                }
            }
            return iStack.pop();
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            ExpressionCalc m = new ExpressionCalc();
            while (sc.hasNext()) {
                // 程序需要前后补一个括号
                System.out.println(m.calc((sc.nextLine() + ")").toCharArray()));
            }
    
        }
    }
    View Code
  • 相关阅读:
    在bindingNavigator1中加入具有更好体验性的DateTimePicker
    static的初始化顺序 (转)
    C#数据结构求最大公约数和最小公倍数[辗转相除法]
    DataGridView控件显示行号
    C# 小票打印机 直接打印 无需驱动[转]
    Core Data 中遇到的一些问题
    字符指针不分配存储区,字符常量存储于静态数据区
    传送门
    Error Set
    实现类似iPhone通讯录新增名片,保存,之后可进行编辑操作的功能
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/9788147.html
Copyright © 2011-2022 走看看