• 西南民大oj 1762 我的式子不可能那么难写 【波兰式】


    描述

    啦啦啦。作为一个苦逼的程序猿。?。请看下图。。。

    现在老总想让你帮他儿子写个简单计算器(他儿子小学3年级,嘘!),写不出来就扣奖金。。快帮他写吧。。。

    给一个包含+-*/()的正确的表达式。要你计算它的结果。
    除法的规则类似C/C++中取整除法。比如:9/5=1 10/5=2
    其他规则参照现实。。。

    输入

     

    多组测试样例

    一行字符串(长度小于200)

    所有参与运算的数字都为小于1000正整数。

    表达式中存在空格。

    数据保证合法。

    输出

     

    一行
    表达式的结果

    样例输入

    1+2
    3+(5-6/(1+2)+10)*8

    样例输出

    3
    107

    提示

     

    ←_←

    话说我的样例很良心啊。

     思路:很久以前西南民大比赛做过的题,其实就是给你一个表达式让你求值,我们可以先将它变成波兰式,然后波兰式求值就简单多了

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <string.h>
     5 #include <stack>
     6 #define maxn 100009
     7 using namespace std;
     8 stack<char>q;
     9 stack<long long>p;
    10 long long priorit[1000],ans[maxn],h;
    11 bool opp[maxn];
    12 char ch[maxn];
    13 int main()
    14 {
    15     priorit[(int)'+']=priorit[(int)'-']=1;
    16     priorit[(int)'*']=priorit[(int)'/']=2;
    17     priorit[(int)'(']=0;
    18     while(gets(ch+1)!=NULL)
    19     {
    20         while(!q.empty())q.pop();
    21         while(!p.empty())p.pop();
    22         h=0;
    23         memset(ans,0,sizeof(ans));
    24         memset(opp,0,sizeof(opp));
    25         long long len=strlen(ch+1),idx=1,j=1;
    26         for(int i=1;i<=len;i++)
    27         {
    28             if(ch[i]!=' ')ch[j++]=ch[i];
    29         }
    30         len=j-1;
    31         while(idx<=len)
    32         {
    33             long long num=0,flag=0;
    34             while(ch[idx]>='0'&&ch[idx]<='9'&&idx<=len)
    35             {
    36                 num=num*10+ch[idx++]-'0';
    37                 flag=1;
    38             }
    39             if(flag==0)
    40             {
    41                 if(ch[idx]=='(')q.push('(');
    42                 else if(ch[idx]==')')
    43                 {
    44                     while(!q.empty()&&q.top()!='(')
    45                     {
    46                         ans[++h]=-(long long)q.top();
    47                         opp[h]=1;
    48                         q.pop();
    49                     }
    50                     q.pop();
    51                 }
    52                 else
    53                 {
    54                     while(!q.empty()&&priorit[(long long)q.top()]>=priorit[(int)ch[idx]])
    55                     {
    56                         ans[++h]=-(int)q.top();
    57                         opp[h]=1;
    58                         q.pop();
    59                     }
    60                     q.push(ch[idx]);
    61                 }
    62             }
    63             else
    64             {
    65                 ans[++h]=num;
    66             }
    67             if(flag==0)idx++;
    68         }
    69         while(!q.empty())
    70         {
    71             ans[++h]=-(long long)q.top();
    72             opp[h]=1;
    73             q.pop();
    74         }
    75         for(int i=1;i<=h;i++)
    76         {
    77            // printf("%I64d ",ans[i]);
    78             if(opp[i]==0)p.push(ans[i]);
    79             else
    80             {
    81                 long long u=p.top();
    82                 p.pop();
    83                 long long v=p.top();
    84                 p.pop();
    85                 if(ans[i]==-(int)'-')p.push(v-u);
    86                 if(ans[i]==-(int)'+')p.push(u+v);
    87                 if(ans[i]==-(int)'*')p.push(u*v);
    88                 if(ans[i]==-(int)'/')p.push(v/u);
    89             }
    90         }
    91         if(!p.empty())printf("%I64d
    ",p.top());
    92         else printf("0
    ");
    93     }
    94 }
  • 相关阅读:
    Java抓取网页数据(原网页+Javascript返回数据)
    FindWindow使用方法
    hadoop学习;block数据块;mapreduce实现样例;UnsupportedClassVersionError异常;关联项目源代码
    Chart控件的多种使用方法
    windows消息钩子
    编程算法基础-一刀切法
    MYSQL BLOB 字段大小以及个数的限制測试。
    linux和windows文件名称长度限制
    WINHTTP的API接口说明。
    hdu4414(DFS 找十字架数量)
  • 原文地址:https://www.cnblogs.com/philippica/p/4375780.html
Copyright © 2020-2023  润新知