西南民大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\n",p.top());
92         else printf("0\n");
93     }
94 }
时间: 2024-10-05 05:28:00

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

西南民大oj(两园交求面积)

西南民大oj:http://www.swunacm.com/acmhome/welcome.do?method=index 我的几何不可能那么可爱 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 11            测试通过 : 8 描述 小朋友们 你们好~ 你们都知道AT立场吧 AT立场又叫“A T Field”,是“Absolute Terror Field”的缩写.直译作“绝对恐怖领域”,又称绝

西南民大oj(递推)

我的数学不可能那么难推 时间限制(普通/Java) : 3000 MS/ 9000 MS          运行内存限制 : 65536 KByte总提交 : 49            测试通过 : 24 描述 没什么题出了,怎么办呀~ 好吧,百度一道去. 于是此题横空出世,只为开心. 小明喜欢下棋,一日他闲来无聊,将黑白棋子排成一长条观察,发现黑色混在一起好难看啊. 随即想到,黑与黑子不相邻,摆放成一长条,有多少种可能乎?! 输入 多组测试数据,(大概1w组吧) 第一行,棋子的总数 n  (

西南民大oj(矩阵快速幂)

我的名字不可能那么难记 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 16            测试通过 : 9 描述 Nirvava:Hi,Misaki,听说ZC要离开了.. Misaki:好走不送,祝一帆风顺… Nirvana: 但他留了好多doge给我们… Misaki:…… Nirvana:而且他们还有名字,名字如下. 据说ZC离去的原因之一就是因为第N个doge老是问他能不能记住它的名字. Mi

2015民大开学典礼|蒙圣光:从现在看未来,在未来看现在

?? [致谢:应母校之邀,回来给8000多名学弟学妹们作开学典礼的分享,感到非常的荣幸,我想自已只是一名喜欢折腾和坚持不懈的创业者,离世人眼里的成功者还很远很远,我都还在不停地奋斗与成长,我想一定是因为赶上了一个大众创业万众创新的美好时代,年轻的学生们需要这种精神,于是苦逼的创业者成了分享经验的热门,但回归现实,革命尚未成功,同学仍需努力!感谢学校领导.感谢校友办的指导与支持!] 分享全文: 尊敬的各位老师,亲爱的同学们: 大家上午好! 我是西南民族大学94级计算机科学与技术学院的学生.今天能够

各大Oj平台介绍

1.题库与网站资源题库-在线提交系统(Online Judge)简介   下面是几个比较大的在线提交系统(OnlineJudge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有Pascal/C/C++/Java)写好源代码提交即可,会实时返回信息告诉你是否正确.采用黑箱测试,系统里有一套标准的输入输出数据(对外保密,而且通常数据很多很怪),你的程序的输出和标准输出完全符合即可.   常见的返回信息有 AC(Accepted,通过).WA(Wrong Answer,输出有错误

各大oj题目分类

PythonTip 在线编程 挑战python 博文 模式 问答 ACM 课堂 下载 吐槽 放松 About 搜索 欢迎您:SSYYGAM | 个人中心| 注销 ACM/ICPC专栏 各大OJ近期比赛列表 各大OJ题目分类 负责任的OJ搜索 POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006POJ1008POJ1013POJ1016POJ1017POJ1169POJ1298POJ13

ACM--模拟--湘大OJ 1184--A Love Letter--水

湘大OJ题目地址:传送门 A Love Letter Time Limit : 1000 MS  Memory Limit : 65536 KB 题目描述 CodeMonkey终于下定决心用情书的方式向心爱的女神表白,当他历经几天几夜写完之后才知道女神有很多不喜欢的词,所以他不得不有把这些词删掉.例如:原文是:ILOVEYOU,女神不喜欢的词是'LV','O'那么最终情书要改成IEYU.现在已知女生不喜欢的词的集合S,CodeMonkey想知道刚写的情书会改成什么样?S={"HATE"

ACM--湘大OJ 1086--菱形--水

湘大oj地址:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1086 菱形 时间限制:1000 ms  |  内存限制:65536 KB Description 小明现在是湘潭大学10级计算机系的学生.他的C语言学的还算可以,但是今天老师布置的一道课后作业题却把他难住了.题目的意思是要在一个N*N(N为奇数)的菱形方格中用字符'*'打印一个菱形和这个菱形的对角线,在这个菱形中除了'*'号字符以外,都以字符'_'填充.图一

ACM--数学--湘大oj 1088--Cycloid

湘大oj题目地址:传送门 Cycloid 时间限制:1000 ms  |  内存限制:65536 KB Description A cycloid is the curve traced by a point on the rim of a circular wheel as the wheel rolls along a straight line. It is an example of a roulette, a curve generated by a curve rolling on