您的位置:首页 > 其它

算法训练 表达式计算

2017-04-22 13:31 246 查看
问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。


//把中缀表达式转换成后缀表达式,然后从左到右扫描一遍即可,
//扫描时可另设一个栈,如遇符号出两个数并计算后将结果入栈
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=120;
char s[maxn];
int cmp[500];
//把符号打表,方便比较优先级
void init(){
cmp['+']=cmp['-']=1;
cmp['*']=cmp['/']=2;
}
int calculate(int t,int t1,int t2){
if(t=='+') return t1+t2;
if(t=='-') return t1-t2;
if(t=='*') return t1*t2; return t1/t2;
}
int solve(){
int i=0,len=strlen(s),c[maxn];
//c为符号栈
int vis[maxn]={0};//判断该位是不是符号
int suffix[maxn];//存储后缀表达式的栈
int t,top=0,tops=0;
while(i<len){
if(s[i]>='0'&&s[i]<='9'){
int t=s[i++]-'0';
while(s[i]>='0'&&s[i]<='9'){
t=t*10+s[i++]-'0';
}
suffix[tops++]=t;
}
else{
switch(s[i]){
case '(':c[top++]=s[i];break;
case ')':
while(top>0&&c[top-1]!='(')
{
vis[tops]=1;
suffix[tops++]=c[--top];
}
top--; break;
default:
while(top>0&&c[top-1]!='('&&cmp[c[top-1]]>=cmp[s[i]])
{
vis[tops]=1;
suffix[tops++]=c[--top];
}
c[top++]=s[i];
}
i++;
}
}
while(top>0)
{
vis[tops]=1;
suffix[tops++]=c[--top];
}
//此时后缀表达式已找到,再临时利用一个栈即可算出结果
for(int i=0;i<tops;i++){
if(!vis[i]) c[top++]=suffix[i];
else{
c[top-2]=calculate(suffix[i],c[top-2],c[top-1]);
top--;
}
}
return c[0];
}
int main(){
init();
scanf("%s",s);
cout<<solve()<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: