【栈】224. 基本计算器

224. 基本计算器

解题思路

  • 首先将输入的字符串转换为字符队列。
  • 调用 helper() 方法,将字符队列作为参数进行计算。
  • 在 helper() 方法中,创建一个栈来存储中间计算结果,初始化符号为 ‘+’,初始化数字为 0。
  • 循环处理字符队列中的每个字符。
  • 如果当前字符是数字,则将其与之前的数字组合成完整的数字。
  • 如果遇到左括号,则开始递归计算括号内的表达式值。
  • 如果当前字符不是数字且不是空格,或者队列已经为空,则说明遇到了一个完整的数字和一个符号,根据之前记录的符号对数字进行相应的操作,并将结果入栈。
  • 如果遇到右括号,则结束当前递归并返回结果。
  • 最后,计算栈中所有元素的和作为最终结果,并返回。
class Solution {
    public int calculate(String s) {
        Queue<Character> queueS = new LinkedList<>();
        for(char c:s.toCharArray()){
            queueS.add(c);
        }

        return helper(queueS);
    }

    private int helper(Queue<Character> s){
        Stack<Integer> stack = new Stack<Integer>();// 存储中间结果
        char sign = '+';
        int num = 0;

        while(!s.isEmpty()){
            char c = s.poll();// 出队字符
            if(Character.isDigit(c)){
                // 如果是数字 
                num = num * 10 + Character.getNumericValue(c);
            }

            // 遇到左括号开始递归计算num
            if(c == '('){
                num = helper(s);
            }

            // 如果是运算符或者是空格  或者是字符栈为空
            if(!Character.isDigit(c) && c != ' ' || s.isEmpty()){
                if(sign == '+'){
                    stack.push(num);
                }else if(sign == '-'){
                    stack.push(-num);
                }else if(sign == '*'){
                    stack.push(stack.pop() * num);// 取出栈顶元素 然后做乘法计算
                }else if(sign == '/'){
                    stack.push(stack.pop() / num);
                }

                num = 0;
                sign = c;
            }

            // 遇到右括号返回递归结果
            if(c == ')'){
                break;
            }

        }
        
        int res = 0;
        for(int i : stack){
            res += i;// 计算最后结果
        }

        return res;
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于计算器实现,使用C语言编写。 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_STACK_SIZE 100 typedef enum { OPERATOR, OPERAND } Type; typedef struct { Type type; union { char operator; int operand; }; } Token; typedef struct { Token stack[MAX_STACK_SIZE]; int top; } Stack; void push(Stack *stack, Token token) { if (stack->top == MAX_STACK_SIZE) { fprintf(stderr, "Error: Stack overflow\n"); exit(EXIT_FAILURE); } stack->stack[stack->top++] = token; } Token pop(Stack *stack) { if (stack->top == 0) { fprintf(stderr, "Error: Stack underflow\n"); exit(EXIT_FAILURE); } return stack->stack[--stack->top]; } Token peek(Stack *stack) { if (stack->top == 0) { fprintf(stderr, "Error: Stack underflow\n"); exit(EXIT_FAILURE); } return stack->stack[stack->top - 1]; } int is_operator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } int precedence(char c) { switch (c) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } int evaluate(int a, int b, char operator) { switch (operator) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: fprintf(stderr, "Error: Invalid operator\n"); exit(EXIT_FAILURE); } } int main() { Stack stack; stack.top = 0; char input[256]; printf("Enter an expression: "); fgets(input, 256, stdin); int length = strlen(input); if (input[length - 1] == '\n') { input[length - 1] = '\0'; } char *ptr = input; while (*ptr != '\0') { if (isdigit(*ptr)) { Token token; token.type = OPERAND; token.operand = strtol(ptr, &ptr, 10); push(&stack, token); } else if (is_operator(*ptr)) { while (stack.top > 0 && peek(&stack).type == OPERATOR && precedence(peek(&stack).operator) >= precedence(*ptr)) { Token operator_token = pop(&stack); Token operand_token_2 = pop(&stack); Token operand_token_1 = pop(&stack); Token result_token; result_token.type = OPERAND; result_token.operand = evaluate(operand_token_1.operand, operand_token_2.operand, operator_token.operator); push(&stack, result_token); } Token token; token.type = OPERATOR; token.operator = *ptr; push(&stack, token); ptr++; } else { fprintf(stderr, "Error: Invalid character '%c'\n", *ptr); exit(EXIT_FAILURE); } } while (stack.top > 1) { Token operator_token = pop(&stack); Token operand_token_2 = pop(&stack); Token operand_token_1 = pop(&stack); Token result_token; result_token.type = OPERAND; result_token.operand = evaluate(operand_token_1.operand, operand_token_2.operand, operator_token.operator); push(&stack, result_token); } Token result_token = pop(&stack); if (stack.top != 0 || result_token.type != OPERAND) { fprintf(stderr, "Error: Invalid expression\n"); exit(EXIT_FAILURE); } printf("Result: %d\n", result_token.operand); return 0; } ``` 使用示例: ``` Enter an expression: 3+4*5 Result: 23 ``` 该计算器实现支持基本的四则运算,并且支持运算符优先级。在实现中,我们使用了一个来存储操作数和运算符,并且在遍历输入表达式时,根据当前字符的类型进行不同的处理,以达到计算表达式的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少写代码少看论文多多睡觉

求打赏,求关注,求点赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值