0
点赞
收藏
分享

微信扫一扫

计算一个合法表达式的值


问题 A: 计算一个合法表达式的值

时间限制: 1 Sec  内存限制: 128 MB
提交: 348  解决: 180
[​​​提交​​​] [​​状态​​​] [命题人:​​li20171026​​]

题目描述

在题目1688的基础上,添加求解表达式值的功能

输入

同1688,一个合法的表达式

输出

除了1688所识别的符号,还要将计算结果在下一行输出

样例输入 Copy


6+2-7


样例输出 Copy


[6] [+] [2] [-] [7] 1


提示

注意:本题要进行词法分析,从中分离出数值和运算符,数值不一定都是个位数哟!

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
using namespace std;
const int maxn=1000;
stack<int>num;
stack<char>op;
char s[maxn];
map<char,int>sign;
void init(int n)
{
s[n]='#';
while(!num.empty()) num.pop();
while(!op.empty()) op.pop();
op.push('#');
}
int main()
{
sign['#']=0;
sign['(']=sign[')']=1;
sign['+']=sign['-']=2;
sign['*']=sign['/']=3;
scanf("%s",s);
int n=strlen(s);
for(int i=0;i<n;i++)
{
if(isdigit(s[i]))
{
cout<<"[";
while(isdigit(s[i])){
cout<<s[i++];
}
i--;
}else{
cout<<"["<<s[i];
}
cout<<"] ";
}
cout<<endl;
init(n);
int x=0;
for(int i=0; i<=n; i++)
{
if('0'<=s[i]&&s[i]<='9') x=x*10+(s[i]-'0');
else if(s[i]=='(') op.push(s[i]);
else
{
while(sign[op.top()]>=sign[s[i]])
{
char f=op.top(); op.pop();
if(f=='('&&s[i++]==')') continue;
if(f=='#'&&s[i]=='#') break;
int fig=num.top(); num.pop();
if(f=='+') x=fig+x;
else if(f=='-') x=fig-x;
else if(f=='*') x=fig*x;
else if(f=='/') x=fig/x;
}
num.push(x);
op.push(s[i]);
x=0;
}
}
cout<<num.top()<<endl;
return 0;
}

 

举报

相关推荐

0 条评论