LeetCode 227 基本计算器2

本文针对LeetCode227基本计算器II问题,提供了详细的解题思路及C++、Golang代码实现。采用单调栈与哈希表方法,通过双栈分别存储数字与操作符,并利用哈希表进行优先级判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode 227 基本计算器2

1. 题目描述:

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例 1:

输入:s = "3+2*2"
输出:7

2. 题解 :

方法:单调栈,哈希表

  1. 本题使用双栈,一个入栈数字,一个入栈字符
  2. 哈希表用来映射不同字符的数量级(注: 本题中无括号)
  3. 从头读取string s ,若是数字,则入栈,字符则先判定数量级,是否需要先计算再入栈。

时间复杂度:O(N), 遍历整个string s 一遍 ;
空间复杂度: O(N) ;
C++:

class Solution {
public:
    stack<int>num ;
    stack<char>op ;
    //当字符的数量级大于栈顶数量级时,先计算
    void eval() {
        int a = num.top(); num.pop() ;
        int b = num.top(); num.pop() ;
        char c = op.top(); op.pop() ;
        int r = 0 ;
        if (c == '+') r = a+ b ;
        else if ( c== '-') r = b-a ;
        else if ( c== '*') r = a*b ;
        else r = b/a ;
        num.push(r) ;
    }
    int calculate(string s) {
        unordered_map<char, int> pr ;
        pr['+'] = pr['-'] = 1 , pr['*'] = pr['/'] = 2 ;
        for (int i = 0 ; i < s.size(); i++) {
            char c = s[i] ;
            if (c == ' ') continue ;
            //若当字符时数字
            if (isdigit(c)) {
                int x=  0 , j = i ;
                while ( j < s.size() && isdigit(s[j])) x = x*10 + (s[j++] - '0') ;
                i = j-1 ;
                num.push(x) ;
            }
            else {
                while ( op.size() && pr[op.top()] >= pr[c]) eval() ;
                op.push(c) ;
            }
        }
        while (op.size()) eval() ;
        return num.top() ;    
    }
};

Golang:

var num []int
var op []byte 
func calculate(s string) int {
    pr := make(map[byte]int, 0) 
    pr['+'] = 1 
    pr['-'] = 1
    pr['*'] = 2 
    pr['/'] = 2 
    for i:=0 ; i < len(s); i++ {
        c := s[i] 
        if c == ' ' {
            continue 
        }
        if c>= '0' && c <= '9' {
            x := 0 
            j := i 
            for j < len(s) && (s[j] >='0' && s[j] <= '9') {
                x = x*10 + int(s[j] - '0') //字符要转换为int 
                j++ 
            }
            i= j-1 
            num = append(num, x) 
        }else {
            for len(op) > 0 && pr[op[len(op)-1]] >= pr[c] {
                eval()
            }
            op = append(op, c)
        }
    }
    for len(op) > 0 {
        eval()
    }
    return num[len(num)-1]
}
func eval() {
    a := num[len(num) -1 ]
    num = num[:len(num)-1]
    b := num[len(num)-1]
    num := num[:len(num)-1]
    c := op[len(op)-1]
    op = op[:len(op)-1]
    r :=  0 
    if c == '+' {
        r = a+ b
    }else if c == '-' {
        r = b-a 
    }else if c == '*' {
        r = a*b
    }else {
        r = b/a
    }
    num = append( num ,r) 
}

原题:基本计算器2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

进击的波吉

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值