• 带括号的表达式的计算


    问题 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());
    }
  • 相关阅读:
    洛谷P2504 [HAOI2006]聪明的猴子
    洛谷P1516 青蛙的约会
    洛谷P1991 无线通讯网
    洛谷P1265 公路修建
    可展开的列表组件
    网格视图(GridView)功能和用法
    自动完成文本框的功能和用法
    扩展BaseAdapter实现不存储列表项的ListView
    使用SimpleAdapter创建ListView
    实例:基于ListActivity实现列表
  • 原文地址:https://www.cnblogs.com/lipu123/p/12895739.html
Copyright © 2020-2023  润新知