中缀表达式计算器

中缀表达式

中缀表示法(或 中缀记法 )是一个通用的 算术 或 逻辑公式表示方法,操作符是以中缀形式处于 操作数 的中间(例:3 + 4)。与前缀表达式 (例:+ 3 4 )或后缀表达式 (例:3 4 + )相比,中缀表达式不容易被电脑解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。
中缀表达式计算器
在这里插入图片描述
中缀表达式计算器基于ArrayStack实现,它将数字和操作符按照相应的规定分别入栈弹栈于各自的栈,具体实现规定如下:

  • 创建两个栈 操作符栈 数字栈
  • 如果遇到数字 直接进数字栈
  • 如果遇到操作符
  •  1.如果操作符栈为空 直接进
    
  •  2.如果操作符栈顶为(  直接进
    
  •  3.如果操作符栈顶为其他操作符
    
  •      (1)当前的操作符比栈顶的操作符的优先级大 直接进
    
  •      (2)当前的操作符比栈顶的操作符的优先级等于或小于 将操作符栈中比当前操作符优先级大的所有操作符处理
    
  •              直到空栈 、( 、小优先级的操作符为止
    
  •  4.当前操作符是) 将操作符栈中( 上面的所有操作符处理掉 最终(弹栈即可
    

代码实现如下:

public class Infixalculator {
    public static void main(String[] args) {
        String expression = "(10+20/2*3)/2+8";
        //格式化表达
        expression = insertBlanks(expression);
        String[] tokens = expression.split(" ");

        //数字栈
        ArrayStack<Integer> numStack = new ArrayStack<>();
        //操作符栈
        ArrayStack<Character> operatorStack = new ArrayStack<>();

        for (String token : tokens) {
            //过滤空字符串
            if (token.length() == 0) {
                continue;
            }
            else if(token.charAt(0) == '+' || token.charAt(0) == '-'){
                //判断是否是“+”或“-”如果是  让操作符栈中之前的所有操作符处理
                while (!operatorStack.isEmpty() &&
                        (operatorStack.peek() == '+' ||
                        operatorStack.peek() == '-' ||
                        operatorStack.peek() == '*' ||
                        operatorStack.peek() == '/' )){
                    processAnOperator(numStack,operatorStack);
                }
                operatorStack.push(token.charAt(0));
            }else if(token.charAt(0) == '*' || token.charAt(0) == '/'){
                //判断是否是“*”或“/” 如果是  让操作符栈中之前 * / 的所有操作符处理
                while (!operatorStack.isEmpty() &&
                        (operatorStack.peek() == '*' || operatorStack.peek() == '/')){
                    processAnOperator(numStack,operatorStack);
                }
                operatorStack.push(token.charAt(0));
            }else if(token.charAt(0) == '('){
                operatorStack.push('(');
            }else if (token.charAt(0) == ')'){
                //处理左括号(栈顶)之前的操作符
                while (operatorStack.peek() != '('){
                    processAnOperator(numStack,operatorStack);
                }
                operatorStack.pop();
            }else { //最后剩下数字
                numStack.push(new Integer(token));
            }
        }
        //将剩余的数字和操作符处理掉
        while(!operatorStack.isEmpty()){
            processAnOperator(numStack,operatorStack);
        }
        System.out.println(numStack.pop());
    }

    //在数字栈中弹出两个数字,并在操作符中弹出一个操作符  做运算
    private static void processAnOperator(ArrayStack<Integer> numStack, ArrayStack<Character> operatorStack) {
        char op = operatorStack.pop();
        int num1 = numStack.pop();
        int num2 = numStack.pop();
        //num1 or num2
        if (op == '+'){
            numStack.push(num2 + num1);
        }else if (op == '-'){
            numStack.push(num2 - num1);
        }else if (op == '*'){
            numStack.push(num2 * num1);
        }else {
            numStack.push(num2 / num1);
        }

    }

    private static String insertBlanks(String expression) {
        StringBuilder sb = new StringBuilder();
        //遍历表达式
        char c;
        for (int i = 0; i < expression.length(); i++) {
            c = expression.charAt(i);
            //如果是符号,则在符号前后增加空格
            if (c == '(' || c == ')' || c == '+' || c == '-' || c == '*' || c == '/'){
                sb.append(" ");
                sb.append(c);
                sb.append(" ");
            }else { //如果遇到数字 则原封不动添加在sb
                sb.append(c);
            }
        }
        return sb.toString();
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中缀表达式计算器可以使用栈来实现。具体方法如下: 1. 定义两个栈,一个存放运算符,一个存放操作数。 2. 从左到右遍历中缀表达式,遇到操作数直接入操作数栈。 3. 遇到运算符时,先将其与运算符栈的栈顶元素比较优先级。 4. 如果当前运算符优先级大于栈顶运算符优先级,则直接入栈。 5. 如果当前运算符优先级小于或等于栈顶运算符优先级,则弹出栈顶运算符和两个操作数进行计算,并将结果入操作数栈,直到当前运算符可以入栈。 6. 遍历完表达式后,如果运算符栈不为空,则依次弹出运算符和两个操作数进行计算,直到运算符栈为空。 下面是一个示例代码,只包括加法和乘法: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int top; int data[100]; } Stack; void push(Stack *s, int x) { s->data[++s->top] = x; } int pop(Stack *s) { return s->data[s->top--]; } int peek(Stack *s) { return s->data[s->top]; } int is_empty(Stack *s) { return s->top == -1; } int is_operator(char c) { return c == '+' || c == '*'; } int precedence(char c) { return (c == '*') ? 2 : 1; } int evaluate(char *expr) { Stack op_stack, num_stack; op_stack.top = num_stack.top = -1; for (int i = 0; expr[i] != '\0'; i++) { char c = expr[i]; if (is_operator(c)) { while (!is_empty(&op_stack) && peek(&op_stack) != '(' && precedence(c) <= precedence(peek(&op_stack))) { int b = pop(&num_stack); int a = pop(&num_stack); char op = pop(&op_stack); int res = (op == '+') ? a + b : a * b; push(&num_stack, res); } push(&op_stack, c); } else if (c == '(') { push(&op_stack, c); } else if (c == ')') { while (!is_empty(&op_stack) && peek(&op_stack) != '(') { int b = pop(&num_stack); int a = pop(&num_stack); char op = pop(&op_stack); int res = (op == '+') ? a + b : a * b; push(&num_stack, res); } pop(&op_stack); } else { int num = c - '0'; push(&num_stack, num); } } while (!is_empty(&op_stack)) { int b = pop(&num_stack); int a = pop(&num_stack); char op = pop(&op_stack); int res = (op == '+') ? a + b : a * b; push(&num_stack, res); } return pop(&num_stack); } int main() { char expr[100]; printf("Enter an infix expression (only + and * operators): "); scanf("%s", expr); int res = evaluate(expr); printf("Result: %d\n", res); return 0; } ``` 输入示例:(1+2)*3+4*5 输出示例:Result: 23

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值