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

来源:互联网 发布:路由器限速软件 编辑:程序博客网 时间:2024/06/05 18:26
问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
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;} 



原创粉丝点击