带括号的表达式的计算

问题 G: 计蒜客

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

KeineDuck的衣服还没有寄过来!闲暇之余,她只好数一数自家的后院里还有多少颗蒜。
KeineDuck家的后院有很多块地,每块地都有一定数量的大蒜。为了使这件事情更富有挑战性,她打算将它们组成一个表达式——一个仅由加号、减号、乘号、除号、括号以及数字的表达式。它的计蒜方式满足我们日常生活中的运算规律——即括号内优先,其次乘法和除法,最后加法和减法。每个都是从左到右计蒜的。
但KeineDuck是个比较单纯的女孩子,因此除法要看成向下取整。比如说,6÷3=2,5÷2=2,10÷11=0。
现在请你帮助她,算出表达式的结果。

输入

第一行一个整数n,意为表达式的长度。
第二行一个字符串,表示要计蒜的表达式。
为了方便选手做题,我们有以下限制:
• 没有多余的空格和括号。
• 开头和嬨之后一定只会出现数字。
• 乘法只会用∗来连接,不会出现()()的形式。

输出

一行一个整数,表示表达式的结果

样例输入 Copy

7
1+2*3/4

样例输出 Copy

2

提示

样例解释:2*3/4向下取整为1,所以1+1=2。

对于20%的数据,只有一个符号。
对于另外20%的数据,只有加法或减法。
对于另外20%的数据,没有括号。
对于100%的数据,表达式的长度不超过300,所有数字不超过1000,最后结果以及中间过程
的值不会超过1,000,000,000。
#pragma GCC optimize(2)

#include<bits/stdc++.h>

using namespace std;
//c(n,k)*c(m,k)*k! 
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
const int maxn=1e5+10;
const int mod=1e9+7;
stack<char>c;
stack<int>v;    
int n;
char a[1000];
char s[1001];
int cnt,val[1001];
int check(char a,char b){
    if(a=='('||b=='('){
        return 0;
    }
    if(a=='+'||a=='-'){
        return 1;
    }
    if(a=='*'&&(b=='*'||b=='/')){
        return 1;
    }
    if(a=='/'&&(b=='*'||b=='/')){
        return 1;
    }
    return 0;
}
int dd(int x,char p,int y){
    if(p=='+'){
        return x+y;
    }
    else if(p=='-'){
        return x-y;
    }
    else if(p=='*'){
        return x*y;
    }
    else{
        return x/y; 
    } 
}
int main(){
    memset(s,0,sizeof(s));
    cin>>n;
    scanf("%s",a);
    a[n]=')';
    c.push('(');
    cnt=0;
    int i=0;
    while(i<=n){
        if(a[i]>='0'&&a[i]<='9'){
            int x=0;
            while(a[i]>='0'&&a[i]<='9'){
                x=x*10+(a[i]-'0');
                i++;
            }
            val[cnt++]=x;
        }
        else{
            if(a[i]==')'){
                while(!c.empty()&&c.top()!='('){
                    s[cnt++]=c.top();
                    c.pop();
                }
                c.pop();
            }
            else{
                while(!c.empty()&&check(a[i],c.top())){
                    s[cnt++]=c.top();
                    c.pop();
                }
                c.push(a[i]);
            }
            i++;
        }
    }
    for(i=0;i<cnt;i++){
        if(!s[i]){
            v.push(val[i]);
        }
        else{
            int y=v.top();
            v.pop();
            int x=v.top();
            v.pop();
            v.push(dd(x,s[i],y));
        }
    }
    printf("%d",v.top());
}
原文地址:https://www.cnblogs.com/lipu123/p/12895739.html