zoukankan      html  css  js  c++  java
  • 西南民大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 }
  • 相关阅读:
    204. Count Primes (Integer)
    203. Remove Linked List Elements (List)
    202. Happy Number (INT)
    201. Bitwise AND of Numbers Range (Bit)
    200. Number of Islands (Graph)
    199. Binary Tree Right Side View (Tree, Stack)
    198. House Robber(Array; DP)
    191. Number of 1 Bits (Int; Bit)
    190. Reverse Bits (Int; Bit)
    189. Rotate Array(Array)
  • 原文地址:https://www.cnblogs.com/philippica/p/4375780.html
Copyright © 2011-2022 走看看