您的位置:首页 > 其它

蓝桥杯 算法训练 表达式计算

2017-05-16 20:01 393 查看
问题描述

  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。

输入格式

  输入一行,包含一个表达式。

输出格式

  输出这个表达式的值。

样例输入

1-2+3*(4-5)

样例输出

-4

数据规模和约定

  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

#include <iostream>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
stack<double>sd;//数字栈
stack<char>sc;//字符栈
char map[8][8] = {

{' ','+','-','*','/','(',')','='},

{'+','>','>','<','<','<','>','>'},

{'-','>','>','<','<','<','>','>'},

{'*','>','>','>','>','<','>','>'},

{'/','>','>','>','>','<','>','>'},

{'(','<','<','<','<','<','=',' '},

{')','>','>','>','>',' ','>','>'},

{'=','<','<','<','<','<',' ','='}

};  //优先级表格
bool isOper(char ch) {//判断是否是运算符
char str[] = "+-*/()=";
for(int i=0;str[i];i++)
if(ch==str[i])
return false;
return true;
}
char check(char ch1, char ch2){//比较运算符优先级
int i,j;
for(i=0;i<8;i++){
if(map[0][i]==ch1)
break;
}
for(j=0;j<8;j++){
if(map[j][0]==ch2)
break;
}
return map[j][i];
}

double Calu(double a, double b, char c){//计算表达式的值
switch(c){
case '+':return a+b;
break;
case '-':return a-b;
break;
case '*':return a*b;
break;
case '/':return a/b;
break;
}
}

void Calulate(char *ch, double *result){
sc.push('=');
int i=0,j;
int sum=0;
int doc=0;
while(sc.top()!='='||ch[i]!='='){//表达式遇到等号退出循环

if(ch[i]>='0'&&ch[i]<='9'||ch[i]=='.')//数字就进数字栈
{	sum=0;
doc=0;
if(ch[i]>='0'&&ch[i]<='9')
sum = ch[i]-'0';
j=i+1;
while(isOper(ch[j]))//循环到一个数字串的结束,也就算遇到运算符停止
{
if(ch[j]=='.'){
doc=10;
j++;
continue;
}
if(!doc){///整数
sum=sum*10+ch[j]-'0';
}
else{//小数
sum=sum+1.0*(ch[j]-'0')/doc;
doc*=10;
}
j++;
}
i=j;//把i移到j当前所在的位置
sd.push(sum) ;//压入数字栈
}

else{//如果是运算符
switch(check(ch[i],sc.top()))///判断栈顶运算符,和 当前运算符优先级
{
case '<':
sc.push(ch[i++]);
break;
case '=':
sc.pop();//遇到括号右括号,把栈顶元素弹出,直到左括号(左括号也弹出)
i++;
break;
case '>':
char x = sc.top();//获取栈顶元素
sc.pop(); //弹出栈顶元素
double b = sd.top();
sd.pop();
double a = sd.top();
sd.pop();
//计算值
*result = Calu(a,b,x);
sd.push(*result);
break;
}
}
}
}

int main(){
double s;
char ch[1010]={0};
scanf("%s", ch);
ch[strlen(ch)]='=';
Calulate(ch, &s);
printf("%.0lf\n", s);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息