用栈实现表达式计算



public class Calculator {

    public static void main(String[] args) {
        System.out.println("*******************");
        //测试计算是否正确
//        String express = "1+2*3-4";     //测试结果为3,正确
        String express = "10*3+4*21/3-15+6*2"; //测试结果为55,正确
//        String express = "70+2*6-4";        //测试结果为78,正确
        int result = handle(express);
        System.out.println("计算的结果是:" + result);
    }

    public static int handle(String express) {
        //数字栈
        ArrayStack numStack = new ArrayStack(10);
        //操作符栈
        ArrayStack opeStack = new ArrayStack(10);
        String keepNum = "";    //用于拼接多位数
        int index = 0;  //索引值
        int num1 = 0;
        int num2 = 0;
        int result = 0;
        char cur = ' '; //索引值所对应的字符
        while (true) {
            cur = express.substring(index, index + 1).charAt(0);
            //判断当前字符是否是运算符,如果不是,则直接压入数字栈
            if (isOperator(cur)) {
                //判断运算符栈是否为空,空则直接加入栈,否则判断当前运算符的优先级是否小于等于栈顶运算符的优先级;
                //如果小于等于,则进行运算
                //否则直接把当前运算符压入栈顶
                if (!opeStack.isEmpty()) {
                    if (priority(cur) <= priority(opeStack.peek())) {
                        num1 = numStack.pop();
                        num2 = numStack.pop();
                        int operator = opeStack.pop();
                        result = calcualte(num1, num2, operator);
                        numStack.push(result);
                        opeStack.push(cur);
                    } else {
                        opeStack.push(cur);
                    }
                } else {
                    opeStack.push(cur);
                }
            } else {
                //当处理多位数时,不能发现是一个数就立即入栈,因为可能是多位数
                //需要向express的表达式的index往后再看一位,如果是数就进行扫描,如果是符号就入栈
                if (index == express.length() - 1) {
                    numStack.push(cur - 48);
                } else {
                    keepNum = keepNum + cur;
                    char next = express.substring(index + 1, index + 2).charAt(0);
                    while (!isOperator(next)) {
                        keepNum = keepNum + next;
                        index++;
                        next = express.substring(index + 1, index + 2).charAt(0);
                    }
                    int num = Integer.parseInt(keepNum);
                    keepNum = "";
                    numStack.push(num);
                }
            }
            index++;
            if (index >= express.length()) {
                break;
            }
        }
        int operator = 0;
        while (true) {
            if (opeStack.isEmpty()) {
                break;
            }
            num1 = numStack.pop();
            num2 = numStack.pop();
            operator = opeStack.pop();
            result = calcualte(num1, num2, operator);
            numStack.push(result);
        }
        //数字栈留下的最后一个元素,即为运算的结果
        return numStack.peek();
    }

    /**
     * 对出栈的元素进行计算
     *
     * @param num1     第一个出栈的数字
     * @param num2     第二个出栈的数字
     * @param operator 出栈的运算符
     * @return 返回运算的结果
     */
    public static int calcualte(int num1, int num2, int operator) {
        int result = 0;
        switch (operator) {
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num2 - num1;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                result = num2 / num1;
                break;
            default:
                System.out.println("出现了异常的运算符");
                result = -1;
        }
        return result;
    }

    /**
     * 获取当前运算符的优先级
     *
     * @param operator 运算符
     * @return 返货运算符的优先级
     */
    public static int priority(int operator) {
        if (operator == '*' || operator == '/') {
            return 1;
        } else if (operator == '+' || operator == '-') {
            return 0;
        } else {
            return -1;
        }
    }

    /**
     * 判断当前索引的位置所对应的是否是操作符
     *
     * @param indexChar
     * @return 返回判断的结果
     */
    public static boolean isOperator(char indexChar) {
        return indexChar == '+' || indexChar == '-' || indexChar == '*' || indexChar == '/';
    }
}

class ArrayStack {
    private int maxSize;
    private int[] stack;
    private int top = -1;

    public ArrayStack(int maxSize) {
        this.maxSize = maxSize;
        stack = new int[this.maxSize];
    }

    public boolean isFull() {
        return top == maxSize - 1;
    }

    public boolean isEmpty() {
        return top == -1;
    }

    public int peek(){
        return stack[top];
    }

    public void push(int value) {
        if (isFull()) {
            System.out.println("栈满~");
            return;
        }
        stack[++top] = value;
    }

    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈空~");
        }
        return stack[top--];
    }

    public void show() {
        for (int i = top; i >= 0; i--) {
            System.out.printf("stack[%d]=%d\n", i, stack[i]);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用实现表达式计算的C++程序: ```c++ #include <iostream> #include <stack> #include <string> #include <cstdlib> using namespace std; int priority(char op) { if (op == '+' || op == '-') { return 1; } if (op == '*' || op == '/') { return 2; } if (op == '^') { return 3; } return 0; } double calculate(double num1, double num2, char op) { switch (op) { case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': return num1 / num2; case '^': return pow(num1, num2); default: return 0; } } double evaluate(string expr) { stack<double> numStack; stack<char> opStack; for (int i = 0; i < expr.length(); i++) { char c = expr[i]; if (isdigit(c)) { double num = c - '0'; while (isdigit(expr[i + 1])) { num = num * 10 + (expr[++i] - '0'); } numStack.push(num); } else if (c == '(') { opStack.push(c); } else if (c == ')') { while (opStack.top() != '(') { double num2 = numStack.top(); numStack.pop(); double num1 = numStack.top(); numStack.pop(); char op = opStack.top(); opStack.pop(); numStack.push(calculate(num1, num2, op)); } opStack.pop(); } else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '^') { while (!opStack.empty() && opStack.top() != '(' && priority(c) <= priority(opStack.top())) { double num2 = numStack.top(); numStack.pop(); double num1 = numStack.top(); numStack.pop(); char op = opStack.top(); opStack.pop(); numStack.push(calculate(num1, num2, op)); } opStack.push(c); } } while (!opStack.empty()) { double num2 = numStack.top(); numStack.pop(); double num1 = numStack.top(); numStack.pop(); char op = opStack.top(); opStack.pop(); numStack.push(calculate(num1, num2, op)); } return numStack.top(); } int main() { string expr; cout << "请输入表达式:"; getline(cin, expr); double result = evaluate(expr); cout << "结果为:" << result << endl; return 0; } ``` 该程序通过两个分别存储数字和运算符,按照运算符的优先级依次计算表达式的值。其中`priority`函数用于判断运算符的优先级,`calculate`函数用于计算两个数字之间的运算结果,`evaluate`函数实现表达式计算。在`main`函数中读入表达式并输出计算结果。 希望能够帮到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值