C++ 四则运算器

 leetcode上的题,只有+-*/,空格,计算所给表达式的数值

我现在用的办法是:中缀表达式转后缀表达式,然后计算

但是leetcode最后一个示例是长度为20w的表达式,直接给我弄超时了,先把代码放在这里吧

//计算器
#include <iostream>
#include <list>
#include <sstream>
#include<windows.h>
using namespace std;
class Solution
{
    stringstream cover;

public:
    bool isTok(char c)
    {
        if (c == '+' || c == '-' || c == '*' || c == '/')
        {
            return true;
        }
        return false;
    }

    void trim(string &s)
    {
        for (auto it = s.begin(); it != s.end(); it++)
        {
            //cout<<*it<<" ";
            if (isTok(*it))
            {
                it = s.insert(it, ' ');
                it += 2;
                it = s.insert(it, ' ');
            }
        }
    }
    int getTokValInner(const string &s)
    {
        if (s == "*" || s == "/")
            return 5;
        return 3;
    }
    int getTokValOutter(const string &s)
    {
        if (s == "*" || s == "/")
            return 4;
        return 2;
    }
    int calculate(string &s)
    {
        trim(s); //去除空格
        //中缀转后缀
        stringstream input(s);
        bool finish = false;
        string a;
        list<string> result;
        list<string> tok; //符号栈
        //cout << s;
        while (input >> a)
        {
            if (!isTok(a[0]))
            {
                //如果是数字,入栈
                result.push_back((a));
                continue;
            }
            //如果是符号,判断优先级
            if (tok.empty())
            { //符号栈
                tok.push_back(a);
            }
            else
            {
                if (getTokValInner(tok.back()) > getTokValOutter(a)) //栈外的优先级比栈内小的话
                {                                                    //弹到空或者到小于等于它的
                    while (!tok.empty())
                    {
                        if (getTokValInner(tok.back()) > getTokValOutter(a))
                        {
                            result.push_back(tok.back());
                            tok.pop_back();
                        }
                        else
                        {
                            break;
                        }
                    }
                } //优先级不满足,正常入栈
                tok.push_back(a);
            }
        }
        while (!tok.empty())
        {
            result.push_back(tok.back());
            tok.pop_back();
        }
        //cout << "逆序表达式:" << endl;
       /* for (auto it : result)
        {  
            cout << it << " ";
        }cout<<endl;*/
        //后缀计算即可
        list<int> num;
        for (auto it : result)
        {
            if (isTok(it[0]))
            {
                //如果是符号,弹出数字计算后压入
                int numb = num.back();
                num.pop_back();
                int numa = num.back();
                num.pop_back();
                int r=0;
                switch (it[0])
                {
                case '+':
                {
                    r = numa + numb;
                    break;
                }
                case '-':
                {
                    r = numa - numb;break;
                }
                case '*':
                {
                    r = numa * numb;break;

                }
                case '/':
                {
                    r = numa / numb;break;
                }
                
                }
                //cout<<numa<<" "<<numb<<"结果1:"<<r<<endl;
                num.push_back(r);
            }
            else
            {
                //cout<<it<<" ";
                num.push_back(stoi(it));
            }
        }
        return num.front();
    }
};
int main()
{
    string str = "1+7-7+3+3+6-3+1-8-2-6-1+8-0+0-2+0+10-6-9-9+0+6+4+2+7+1-4-6-6-0+6+3-7+0-4+10-2-5+6-1-3+7+7+2+0+2-8+7+2-3-8-9-6+10-7-6+3-8+5+6-7-10-6-8-10-8+1+9+1-9-1+10+10+3+7-1-10+1-0-7+0-3-3+4+7-9-10-1+4-8-3-0-1-0-3+5-10+6-6-0-6-6-7+7+10+10-5-9-10-2-8+9-2-8-7-9-0-6-5-1+1+3+8-5-8+3-9+9+6-5+0-2+0+8+8-4+6+1-2-0-10-8+1-2-8+2-2-2-4+2+5+3-9+1+9-8+9-8+7+10+1+10-9+2+2+8+7-10-8+6+6+3+0+4-1+0+7-3+8-8-4+8-6-6+3-3-9+6+4+6+7-2-0+6-10+8-2-4+3-8+1-2+8+1-2-4-3-9-4-1-3+5+9+7-8-2+7-10+7+9+1+5-5+8-3-10-7-1-7+10+3+2-8-8+0+9+3+6+8+4+2+10+8+6-1+2+10-5+5+4-2+10+7-6-5+9-9+5-5-2+5+2-1+7-8+4-2+2+2+5-10-7-0+5-8-6-10-5+9-1+1-8+10-7+2-3-3+2+3-8+4-6-7+3-0+6-6-3+1+2-6+2+3+0-4-0+3-5-1-4-0+9+5-6+3-10+0+10-4+6-6-5-6+5+3+7-4+6+2+0+10+4-3+10-10-0-10-4-8+9-5-0-0-9-8-3-2+6-2+5-4-6+7-8+8-8+10-0+10-3-9-5+0+10+6+9-3-0-8+4+5-4-9+0-2-3-0-9+1-4-1-6-9+1-0-0-5+1-6+1+6+0-4-9+10+2+0-8+0-10-3+5+6-3+5-1-0+6-5+5-0+0-4-1-0-4-6-5+5+1+10+10+6+0+3-6-9-9+2+8+3-2+10-5-8-4+9-6+7+3+2-9-8+8-9-6+3-7+7+10+3-10-2-7-4+3+3+10+5-6-8+10-6+1-8-5+10-0-6-8-7-10-0+5-3+10+9-8-7+2-2+2-8-5+6-6+9+3+1+0+7-9+10-0+8-0+2+8-2+4+10-6-2-9+3-9+4-10-2-6+6+8-10+7+9-4-8-1-9-8+2+8+10-3-4-8-0-7-10-6-6-2+4-2-1-7+1+8+5-0+8+7+0+0-6-10-7+9-3+10+7*10-3-7-4-2+2+9+8+5+2+0-3+2-5+10-3+3+2-10+5-4-1+7+1-3-8-2-1-1-6-7+6+10+3-10+2+2+8+6+10+7+9+8+3+4+10+4+1+2-1-1+0-7-7+8-10-7-1+4-9+1+8+3+9-9+8-1+0-9-7+7+4-3-5-8+10+7+9-8-5-8+4+10-3-3+1+7/2-9+3+8-1+8-5-10-9-0+9-8+1+1-8-7-4-3-8-7-9+6-1+1-2+6-6+8-7-10-3+8-7-0-3+6+1+10+8+3+9-2+8+3-9-2+0-4+2+2-10+7-2-8+2-9-1+8-9-9-2-8-7+3-1+9-5+0-2-10-9+7+10-2+8-7-8-8+0-3-7+2+10+4+4+2-9+5+2+2-7+1-2+10-9+5+5-7-8+8-6+2-8+1-7-1-0+6-5+4-4-0-4-1-1-9-6-9-2-10+4+6-3+5+8-6+3+8+3-3-7+4-5-3-7+8+9+0-3-5+0-10+9+10-1+1-8-9+1-9+2-8+10+2-7+10+9-9-7-4-10-0-8+10-4-4-9+2-8-10+2-6-6-9-1-7-6-7-9-9-9+9+10+1+1+5-3+9-8-7-7-4-10+7-7+1-4+6+10+0+10-0+0-0+6-3-3+3-10-7+4-1-4-7+7+5+8+1+3+4-9+5+5+1-10-4*3-9-3+5-6-2+6-10-1-6+4+5+2+4-7-3+2+9-10-1-0+4-10-2+10-8-3-7-0+4-6+2-3-10+4+7+7-8-9+5+9-2+8+7-3-4-3-3-5-8-0-5+5+0-3+5-6+9-6-3-2+6+7+4-10-5-9+4-1+6-6+5+3-7-4+4-7-2+0+5-1-5-7+9+0-6+7-3+2+10+9-1-5-3-10-4+9+3+1-3+7-2-5+4+7+9-10+7+9-3-4-10+8+0+2+6+10+8-0-7+7+3+0-7-0-10-0+1-0-6-7+10-4-0+1+6+1+4-7+7+1-1-1-9+6-9-8-0+3-2+3-0-5-10-3+8-8+3+5+0-0+0-4-1+8+7-8+10-10+1+5-6+2-7+3-6+3+10-5+8-7+4+8-9-7-8+8+5+0+8+7+3-0-8+9+1-2+10-0-0-8-4+0+9-6+9+4-2-9-4+6+8-1+0+1+10-8-6+7-10-1-10+1-3+6-6-7-7+6-8-4-8+1-8-9+3-6+1+7-7+8+0+1-1+4-7+6-9+4+5-3-9+3-2-5-1+0+4+3+4-8-2+2+2-9-8-9+0+5-3-10-8-4-10-7-4+4+10+10+0+8-9+4-2+1-2-5-9+8-3-0-8+6-5+8-5+6-6-1-10-9+2-7-5-8+3-3+0-9-4+1-7-4+8+1-1-2-8+9-2-2-10-5-3+7+9-6+8+0-5-8+2-7-8+7+0-5-4+6-0+5-8-10+3-0+7+10-1-9+1-2-0-10-5+1+6-1-8+8-10+3-8-9-1-9-9-2-2-2+2+7-9+1+4-5-4-2+1-10+6+5+6+3-4-0-1+9+7+10-9+9-0+7-3-9+10+7-1+1+6-6-5+6-8-3+4+2-7-8-3+10-1+3-2+10-0-7+5+4+7+5-9+3+10-1+9+7+7-7-0-0+8+3-9-5+5-10-6+10+10-3+4+8+2-9-0+1+5-0-1-7+8-5+9+1+4+4+2+8+10+4+2+5+1+9+9+6+8-3-4-0-0+8-7-8+8-0+6-10+3+1+9-0-10+2-10+7-6+10-5+5-10+4+4-10-4-1+3+2+2+3+5-9+6-4+2+7+9-3-3-9+5+9-2-2+8+10-2-2-7+6-3-1+0+8-9-6+4-5-2-6+2-5+2-1+3-7-0+7+10+1+8+4+1-10+8+6-0+6-7-2+8+4-7-4+6+2-10-0+9+7-8+8-1+10+6+2-7-9+10-4-0+10+7+4+8+3-2+3-4-0-6+10+9+8-10+6-3-7-8-8-10-9+8+10-6-2-2+7-8-6+2-6-3-7-1+0-10-3+6+10+2+8+7-4-5+4+9-6+7+7+8-5+3-0+3-9+0+1+9-8-6+3-4-6-3-8+3-7-2-10+0+8-0+4+8-5-6-0-9+10-5+5-8-7+8+6+8-5+6-3-6-3-5-3+4-6-3+4+1-9-3+5-8+3-6+5-8-4+9+3+1+6+10+1+5+1+9+6-10-8-5-3-3-1-10-7+3+5-2+3-5+4+7+7-10+4+8+5-0-2+8-7+1-8-10+3+8-3-4-5+2-6-7+6+0-9-1+4+4-9+4+10-6-7+10-0+9-1+10+0+8+8+7-2-3+5+9-5+1-1+5+9-2+7-4-8-1-9-3-7-8-4+1+7-0-6-9+6+8+6-5+5+7+3+8+1+7-2+1+0-7+9-9+5+10+1-5-3-4-6-7+10+0-4-6-8+6-3-0-2+7+2+2+9+10+0+6-1+8-6-0-9-9+10-6+4-10-10-9-10+7-0-1+0-9-4+5-6+10+5+5-8+8+8+10-10-4+7+5-7-10-10+7-7+5+1+9-5+6+0-2-6+9-4+1+8+6-4+9-4+1-1-2-5-2-6-1+2-2-5-9+7-2-8-1+9+1-2+8-8-6+8-3-8-5-6+3+8+1+1-4+9+7-10-3+5-10+1+0-5-6-7+9-6-8-5+4+0+3+2-2+10-9+2+2+0+10+3+0+8-6-3+8+10+0+3-2-3+7-2-1+4+10+5-8-1+9-9+4+9-10+7-2-10+6+4+4-5-9-7-4-1-9+5-2+6+0-4+4+8-0+5-10+0-7-9+6-8+3-0-10-2+2+7-3+10-2+3-3-9-0+10-2+3+3-9+5+8+4-3-6-2-1-0+7+10+4+2-10+4+6+2-4-9+5-3+8-10+0+0-4-1+10+0-3-0+9+9+5+0-2-4+4-9-4-8-10-9-1-10+9-3+6+3-1+0-1-6+10-4-5+0+1+4-3+7-2-8-3-4+5+6+7-9+8-6+10+7+4+2+10+9+0+5+9-0-0-10+7+7-6-3-2+1-5-2-7+0+10+6+0+8+1-7+9+2+5+5+9-1-0-9+1+10-6+2-1+6-6-2-10+4-10-10+1+7-4-0+4+2-5-4-8+9-3-7+3+6-5+9+7-9-3+9-5+8+9+1-4-3+7-8-4+9-7+10+4+8-8-3-0+8-9+3-9-1+9+0-1-3+0-7+4+9+4+0+10-0-6-3-8+2+3-7+4-6-5+8+3+4-1+6+2-8+10+1-9-2+10+1+7+1+2+3-1+9+9-3-10+8-9+2-4+7-10-2+4-3+5-10-9+9+3-10+5-1-7-7-6+7+3-10+9+8+7*5+8-7-7-1+2-0-5+2+1+6+7+7+5+6+0+0-0+2+3-1-10-2-0+4-9-1-10-3+9+7-0+0+10+10-8+9+1-10+1-1+7+6+7-7+4+0+1+2+4-4+7-4-0-10+7+3-10+9-1-1-9+4+7-3+8-1-2-10-8+9+3-3-8+4+0+1-9-0-7-2+7-10+0-8+7-10-7-8+7+6+5+0-0-3+0-7-3+2+3-1-6-5-0-9+0+7-6-6+5-8+3+6+0-6-4+4+7-0+9+4-9+3-10-3+4+7+4+4-4+4+5+2+3+5+6+2-5+1+4-10-8-9+6+9-9+4-7+4+4+4-3+3-7-9+3+9-6-0-3-8+1-4+0-8+8+5+1+6-6+8-5+1+8-8+6-8+7+2+2-10+2-10+10+5-7+9+9-6+3-2+9-8+9+0+1-0-1-4-4-2+2+10-6-4+9-5-7+10+1-9+0-0-4-7-5+7+6-1+2-2-10-1+5-9-9-2-3+10-1-5-10+5+1+9-4-2-8-2+8-7-7-7+7-0+3-9+10-7+4+4+2+5+6-3-10-3+5-8-7+1-4+2-9+4+2-8-3+9+2-5-0-2+0-0+2+3+0+8-7+7-8-4+0-5-3+5-2+8-7-6-4-1-2+2+1-8-0+4-10+2-10+3-5+6+6-3+3-2+5+3-5+4-1-9+1-0-1+7-1+3-5-1-0-5-0+5+5-2-4-6-7-3+6+7+5+8+2+4-1+9+6+6+4+5-7+4+9+8+3+2-8-6+2-4-10+10-3+5+8-6-9+10-1-10+7/8+5-3-5-10-3+7-9-5-10-1-2-10-5-5-5-10+6-4-5+5-5-5-5+4+6-8+5+8+0-1-8-6-4-8-8-3+1-10+8+4+0+9-10-3-2+5+9-2+4+10+2-6+1-3-9+4+0-4+5+2-9+6-4+10-3+6-7+7-2+10+10+2+9-9-9-3+9-4-10+5-7+4-3-2+4-5+5-1-3-10-5+3-3-6+1-9+7-2-1-2+9+0-2+4-8-4+6+1-8+4+0-2-10+2+10-8+8+6-1-2+2-2-10+0+10-7-2+8-10+8+3+1-5+0+4-10+7-0-6+9-3-3+1+7-2-7+3+2+5-10+5-5-9-6-7+5+7-8+6-5+8-2-9-6+7+10+5-9+7+1+1-5+2-5+1-3+4-2-1-7-5-8+3+0+5+5+4-6+2-8-1+2-9+9+6+10-10+7+3+8-1-10+7-3+10+7-10-8+6+9+4-1+8+8-9-9+7-5-10+4+0+5-0+5+2-1-3+1+7+4-4+6-5-9-9-8-1+9-1+1-6+3-5-10-10-9+2+3-2+2+3-3+9+6-10+6+8-7-4-7-9+10-0+4-0-0+5+3-9-7+9+9+1+7-9+8-4+10+6+7+4-2-8+10+0-8+6+7-10+2+1+1-5+9-1+7+6-0-0-1-7+2-4+0-1+6-2+8+0+10+7-9-4-0-7-6-3-2-2+4-2-6-9+7-6+8-0+4+10+2-10+10-8-8+5-6+4-8-6-1+0-1-7-7+3+0-7-5-0+8-0-9+7+10-6+8-4+7+3+6-4-0-10+4+0+2+3-5-9+8-6-0+1-5-0+4+10+0+2+2-6-7+7+0+2+3-4+4-2+8-7-8-3+2-3+0+1-4+0+1-5+5+9-7-10+2+3+8+1+8-7+9-9+2-0-4+7-3-0-5+1+8-1-6-10-2-6-5+10+4-1-6+9-2+10-4-5+9-8-5-8-4-4+7+4+4+2-2-3-3-5+0-0+10-8-4-0+9+4+0-2+5+3-1+5-10+1+3-7-6-10-7+4+10+6+7+1-8-2-9-5-7-4-2-6+7-7-10+5+0-8-1+5-8-9-9-2-5+0-1+3-7+7+0-5-8+10+9+10+9-1+6-6+8-2-5+2-3-10-10+6+6+4+9+6+0+7-1+5-5+0-7+2-8-5+4+7-1+5-9+3-4+7+3-9+2-6+3+0+2+0+3+9-7-6-7+9-5+8-6-2-1-0-0+5+8-8+5+0-8+10-10+6-6+5-0+10+6+9+7+10-2+9+1+6-10+10-0-9-10-8-2+4-5+3-3+9-5-10+6+0+0+8-1-6+0+5-4-4-2+10+9-2+3+1+1-6-2-9-7-5-0-1-9-8-7+4+0+1+0-9-4+4-7+2+4+6-9+3+6+10+6+6-4-5+7+3+9+1-9-3+7-6+2+3-3-1+1-2+9-2+4+6+6-3-6+10+5+1+10+2+2+2-1-4-5+4+10+10-10+9+7+2-2+2-1-6-6+9-10+5-4+5+5-2-4+7-5-3+9+7+4-7+10-0+1+7-5-9+4+4-7+10+9-1-4+4-10-1-6-2-3-10+4+10+6-7-3-0-5+7-7-0-7+0+6+9+9+8+1-3+5+7+5-8+4-1+5-10-5+3-9-1-6+4-0+1+4-5-10-1+9+2+4+7-1+0-1+6-10-1+7+1+3-3+9+5+5-2+6+3+1-5+7+6+0-1+0-2-2-6-5-9-8-3+7+0+3+5+3+2-7-0-2-6-7-6+4+2-3+9-7-6+0+4-8+8-10-10+3+5+9+1+9+5+8+8+1+3-2+9+6-6-5-6+3-5+8-4+8+5-3-9-5+1+3+10-2+2+10+1+10-0+7-10-7-9-1+3-6+9+0-0+8-4+6-6-3+8-6+1-5-7-1-5-0-10-6+6-8-0+6-6-7-1+2+2-2-6+9+8+1-0+6-10-6-4-7+6+6-7+5+9+8-0+4-4-1-10+10-1+3-7-6-6-5+0-6-8-0-3+8+1+8+5-9-7-4+0-7-6+5-6-0+0+7+5+0-7+3-3+6+5+8+9-3+10-3-0+9-5+5+6+9+0-3+10+10-2-8-2+6-2+5-2-8-2+4+1-4-1+10+8/6+4+0-2+2+4-6-8+0-10-6+0+9-10+5-0-3-4+4+10+2+6-1-0-10+1+1+3+1+10-1-0+5-0-0+9-2-3+3+10-1+6+9-1-8+0-8+3+1+1+10-7+1-3-1+8+10-7-6-8+3+10-8-4+10+7-10-5-3-7-5-10+9-1+5-9+6-0+10+3-9+4+10-3-8+3-0+5+7+5-10-10-5+10+3-4-0+0-0+2-6+4-7-7+5-2+8-1+8+4-1-5-6+8-8-1-2-1-5-7+10-7+3-6+6-10-10-8+4+8-7+7+5+10-9-1-4-5-9-4+1+7-3-0-4-1-3-6+3+9+7-2-4-6-4+2+0+6+6-8-10+4-1+1-6-8+9-2-4+2+5-8-2+1-0+4+9-3-4+8-6+7+3+5-4-7+6-9+1-6-4+2+6-10-10+4+9-4-8-6+10+0+10-4-4-6-5+1+2+8+5-9+7+6-0+9-3-0-1+5-10+1+0-0-5+0+1-8-7+5-5-0-7+1+8+1-1+1+3-5-1-9-1+0-7+9+4-4+6-9+1-4-1-3-0+6+2-8-5-10-0-7-9-5-6-2+9-2+10+10+5+6+8+8+3+2-8+9+6+1+5+8-0+2+9-6+10+7-2-0+8-0+1+1+0+10+5-7+3-8-9+10+9-9+9-8+4-1+1+7+6-6-1+7*8-9-6+3-4+10+3-9-0+0-8+3-8-10+4-1-7+2-2+5-2+4+0+7+2-6+7-7+10-10+1+2-4+0-4-6-9+8-0-9+10-8+2+2+6+1-6-10+1-6-9-0-7+1-7+1-9-7-4-8-9+2-6+0-8-10-0+6+6+9+4-4+6+3+7-10+8-1+7-3-4-2-4+9-9-9+5+9-3-1-2+2+3+5+9-0+5+4+9+3+2-3+9+10-1-6-3+9+5+6+2-4-5+2-7-10-1+8-9-6-7-4+10-0+6+10+3+10+0-4+2+5+2+3+4+7-0-9+0+7+9+8+5-9+10+8+4-7-9+5-0+4+10-6-0+4+6-5+5+10-9-3-6-4+8+9-7+7-10-8-5-7-4-6-1-0+10-4+3-1-1-10-5+6-6+6+4-10+4-5+7+10+6+8+3-9-1+3+3-3+10-7-1-3-9-5+4-6+0+0-4+1-9-2+5-2-3-2-5-3+3-7-5-6-2+1+2+4+8+1-2+7+1-2-8-4-6+8-0-2+9-3-10-0-3-9+1+9-3-8+3+2+4+10-6-2-0-0-8-1-10-10-4-2-6+9+6-6+6+8-5-6-5+2-10-1-8-5+0/4-7+2-8-5+9-10-3+5-10+2-6+8+10-7-3+8-7-8-10+4-9+2+8-6-8-0-7+0+8+4-10+6+9-2-8-7+9-8+7-0+4+10-10+9+0-0+10+6+10+9+5+8-3-6-2-4-3+6+5-3-6-6+2+7+5+0-5+2+4-9-6+3-0-9+10+7-0-10+3-8+2+9-7+4-3+2+2+6+1+3-4+8-7-2-10-3+9-7-4+7-1-4-8+3+7+0+3-10-7+2+8-2+4+7-2+9-7+2+10+3-3+6+9+8-4+0-6+0+9-3+6+10+6-9+2+5-1+4-2-1-7+1+3-8+1+6-1-8+7+5-3+10+7+0-2-5+4-8-1+0+3+3+6+3-9-3*7-9-6-0-1";
    Solution a;
    DWORD s=GetTickCount();
    cout << a.calculate(str)<<endl;
    DWORD e=GetTickCount();
    cout<<e-s<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值