zoukankan      html  css  js  c++  java
  • hiho #1332 : 简单计算器 栈+递归

    #1332 : 简单计算器

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    编写一个程序可以完成基本的带括号的四则运算。其中除法(/)是整除,并且在负数除法时向0取整。(C/C++/Java默认的除法就是向0取整,python默认的是向负无穷取整。)

    例如计算 100 * ( 2 + 12 ) - (20 / 3) * 2, 结果是1388。

    输入

    一个长度不超过100的字符串,代表要计算的算式。包含数字0-9以及+-*/()。

    输入保证计算过程不会超过32位有符号整数,并且其中的'-'都是减号没有负号。

    输出

    计算的结果。

    样例输入
    100*(2+12)-(20/3)*2
    样例输出
    1388

    思路:栈模拟,因为有个括号,所以需要重复调用自身,写个函数;
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define esp 1e-10
    const int N=1e5+10,M=1e6+10,mod=1e9+7,inf=1e9+10;
    char a[M];
    ll getnum(char *a,ll lenn)
    {
        stack<char>s;
        stack<ll>num;
        ll x=lenn;
        ll pos=0;
        ll n=0;
        ll ans=0;
        if(a[pos]=='(')
        {
            ll en;
            ll flag=0;
            for(ll j=pos+1;;j++)
            {
                if(a[j]=='(')
                flag++;
                if(a[j]==')')
                {
                    if(flag==0)
                    {en=j;
                        break;
                    }
                    else
                    flag--;
                }
            }
            ll len=en-pos-1;
            num.push(getnum(a+pos+1,len));
            pos=en+1;
        }
        else
        {
            for(pos=0; pos<x&&a[pos]>='0'&&a[pos]<='9'; pos++)
            {
                n*=10;
                n+=a[pos]-'0';
            }
            num.push(n);
        }
        while(pos<x)
        {
            s.push(a[pos++]);
            if(a[pos]=='(')
            {
                ll en;
                ll flag=0;
                for(ll j=pos+1;;j++)
                {
                if(a[j]=='(')
                flag++;
                if(a[j]==')')
                {
                    if(flag==0)
                    {
                        en=j;
                        break;
                    }
                    else
                    flag--;
                }
                }
                ll len=en-pos-1;
                n=getnum(a+pos+1,len);
                pos=en+1;
            }
            else
            {
                n=0;
                while(pos<x&&a[pos]>='0'&&a[pos]<='9')
                {
                    n*=10;
                    n+=a[pos]-'0';
                    pos++;
                }
            }
            if(s.top()=='*')
            {
                ll k=num.top();
                num.pop();
                num.push(n*k);
                s.pop();
            }
            else if(s.top()=='/')
            {
                ll k=num.top();
                num.pop();
                if(n!=0)
                    num.push(k/n);
                else
                    num.push(n);
                s.pop();
            }
            else
                num.push(n);
        }
        while(!s.empty())
        {
            if(s.top()=='+')
                ans+=num.top();
            else if(s.top()=='-')
                ans-=num.top();
            num.pop();
            s.pop();
        }
        return ans+num.top();
    }
    int main()
    {
        ll x,y,z,i,t;
        scanf("%s",a);
        printf("%lld
    ",getnum(a,strlen(a)));
        return 0;
    }
    // (1-2*3)/(2*3+(0-1))
  • 相关阅读:
    老调重弹之整除与实数除
    #define 预处理指令(C++,C#,VB.NET)
    char类型和string类型(C++,C#)
    使用XPATH对XML数据进行解析
    SQL Server查询优化之:使用提示(Hints)
    XSLT几种应用场景
    在C++中定义常量的两种方法的比较
    为SSIS编写自定义任务项(Task)之高级篇
    利用反射绑定事件处理程序(C#)
    自定义打开Reflector的方式
  • 原文地址:https://www.cnblogs.com/jhz033/p/5676600.html
Copyright © 2011-2022 走看看