描述
啦啦啦。作为一个苦逼的程序猿。?。请看下图。。。
现在老总想让你帮他儿子写个简单计算器(他儿子小学3年级,嘘!),写不出来就扣奖金。。快帮他写吧。。。
给一个包含+-*/()的正确的表达式。要你计算它的结果。
除法的规则类似C/C++中取整除法。比如:9/5=1 10/5=2
其他规则参照现实。。。
输入
多组测试样例
一行字符串(长度小于200)
所有参与运算的数字都为小于1000正整数。
表达式中存在空格。
数据保证合法。
输出
一行
表达式的结果
样例输入
1+2
3+(5-6/(1+2)+10)*8
样例输出
3
107
提示
←_←
话说我的样例很良心啊。
思路:很久以前西南民大比赛做过的题,其实就是给你一个表达式让你求值,我们可以先将它变成波兰式,然后波兰式求值就简单多了
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stack>
#define maxn 100009
using namespace std;
stack<char>q;
stack<long long>p;
long long priorit[],ans[maxn],h;
bool opp[maxn];
char ch[maxn];
int main()
{
priorit[(int)'+']=priorit[(int)'-']=;
priorit[(int)'*']=priorit[(int)'/']=;
priorit[(int)'(']=;
while(gets(ch+)!=NULL)
{
while(!q.empty())q.pop();
while(!p.empty())p.pop();
h=;
memset(ans,,sizeof(ans));
memset(opp,,sizeof(opp));
long long len=strlen(ch+),idx=,j=;
for(int i=;i<=len;i++)
{
if(ch[i]!=' ')ch[j++]=ch[i];
}
len=j-;
while(idx<=len)
{
long long num=,flag=;
while(ch[idx]>=''&&ch[idx]<=''&&idx<=len)
{
num=num*+ch[idx++]-'';
flag=;
}
if(flag==)
{
if(ch[idx]=='(')q.push('(');
else if(ch[idx]==')')
{
while(!q.empty()&&q.top()!='(')
{
ans[++h]=-(long long)q.top();
opp[h]=;
q.pop();
}
q.pop();
}
else
{
while(!q.empty()&&priorit[(long long)q.top()]>=priorit[(int)ch[idx]])
{
ans[++h]=-(int)q.top();
opp[h]=;
q.pop();
}
q.push(ch[idx]);
}
}
else
{
ans[++h]=num;
}
if(flag==)idx++;
}
while(!q.empty())
{
ans[++h]=-(long long)q.top();
opp[h]=;
q.pop();
}
for(int i=;i<=h;i++)
{
// printf("%I64d ",ans[i]);
if(opp[i]==)p.push(ans[i]);
else
{
long long u=p.top();
p.pop();
long long v=p.top();
p.pop();
if(ans[i]==-(int)'-')p.push(v-u);
if(ans[i]==-(int)'+')p.push(u+v);
if(ans[i]==-(int)'*')p.push(u*v);
if(ans[i]==-(int)'/')p.push(v/u);
}
}
if(!p.empty())printf("%I64d\n",p.top());
else printf("0\n");
}
}