leetcode 计算器问题

leetcode 计算器问题

面试题 16.26. 计算器

224. 基本计算器

227. 基本计算器 II

题目类型描述

本类型的题目就是模拟计算器的实现,运算符包括+-*/^()等,对于本类问题,使用双栈便可解决,思路便是使用两个栈,一个保存操作数,一个保存运算符,对于运算符的优先级,使用map保存优先级。

(1) 如果当前为"(",那么就把该运算符入栈,考虑到(可能直接跟着-,所以判断(如果带着-,那么就在操作数栈里面加一个0,操作数栈入栈-

(2) 如果当前为")", 那么就一直出运算符栈,一直遇到),在运算过程中逐步把运算结果入栈。

(3) 如果当前为数字字符,那么把数字字符串转为数字,然后入操作数栈

(4)如果当前为运算符+-*/^,那么就要先把运算符里面比当前运算符的优先级高的先运算掉,如果遇到(,也要停止

注意为了防止第一个字符就是-,最开始操作数栈加一个0

代码实现

class Solution {
public:
    map<char,int>op_pir={
        {'+',1},
        {'-',1},
        {'*',2},
        {'/',2},
        {'^',3}
    };
    stack<int>nums;
    stack<char>ops;
    void cal()
    {
        int a=nums.top();nums.pop();
        int b=nums.top();nums.pop();
        char op=ops.top();ops.pop();
        int res=0;
        if(op=='+')
            res=b+a;
        else if(op=='-')
            res=b-a;
        else if(op=='*')
            res=b*a;
        else if(op=='/')
            res=b/a;
        nums.push(res);


    }
    int calculate(string s) {
        int len = s.size();
        nums.push(0);
        for ( int i=0;i<len; i++)
        {
            if(s[i]==' ')
                continue;
            else if(s[i]=='(')
            {
                ops.push(s[i]);
                if(s[i+1]=='-')
                {
                    i++;
                    ops.push(s[i]);
                    nums.push(0);
                }
            }
            else if(s[i]==')')
            {
                while(!ops.empty()&&ops.top()!='(')
                {
                    cal();
                }
                ops.pop();
            }
            else if(s[i]>='0'&&s[i]<='9')
            {
                string snum="";
                while(i<len&&s[i]>='0'&&s[i]<='9')snum+=s[i++];
                i--;
                nums.push(stoi(snum));
            }
            else
            {
                while(!ops.empty()&&ops.top()!='('&&op_pir[ops.top()]>=op_pir[s[i]])cal();
                ops.push(s[i]);
            }
            
        }
        while(!ops.empty()) cal();
        return nums.top();
    }
};
上一篇:关于一些网络协议的思考


下一篇:牛客多校第六场8月2日补题记录