码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-03-29 16:21:39      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

描述

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

现在老总想让你帮他儿子写个简单计算器(他儿子小学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\n",p.top());
92         else printf("0\n");
93     }
94 }

 

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

标签:

原文地址:http://www.cnblogs.com/philippica/p/4375780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!