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\n",getnum(a,strlen(a)));
    return 0;
}
// (1-2*3)/(2*3+(0-1))

 

posted @ 2016-07-16 15:33  jhz033  阅读(456)  评论(0编辑  收藏  举报