首页 > 其他 > 详细

带括号的表达式的计算

时间:2020-05-15 16:41:40      阅读:54      评论:0      收藏:0      [点我收藏+]

问题 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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!