-
题目1101:计算表达式
-
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2756
解决:790
-
题目描述:
-
对于一个不存在括号的表达式进行计算
-
输入:
-
存在多种数据,每组数据一行,表达式不存在空格
-
输出:
-
输出结果
-
样例输入:
-
6/2+3+3*4
-
样例输出:
-
18
-
来源:
- 2010年上海交通大学计算机研究生机试真题
-
- c++代码:
-
//其实和1019题目一样。 /*但注意 1019是每个计算公式一行,这个有可能1行有两个公式。 不存在空格 为单个数字的时候,也要输出结果。 不存在小数。对于除法而言,相除结果一定是整数。 最后输出结果即可。 */ //默认输入合法 包含数字 + - * / 空格 #include<stack> #include<string.h> #include<string> #include<stdio.h> #include<cmath> #include<iostream> using namespace std; #define ENDOFSTR '#' const int mat[][5] = {//优先级矩阵,0为#;1为+;2为-;3为*;4为/;#优先级最小 //如1,2即符号栈顶为+ 当前符号位-, //mat[i][j]=1则代表i优先级高于j,0表示不高于 1,0,0,0,0, 1,0,0,0,0, 1,0,0,0,0, 1,1,1,0,0, 1,1,1,0,0, }; //操作符标号 int ch2pri(char x) { //#,+,-,*,/对应0.1.2.3.4 switch (x) { case '#': return 0;break; case '+': return 1;break; case '-': return 2;break; case '*': return 3;break; case '/': return 4;break; default:break; } } double cal(double x, char op, double y) { switch (op) { case '+': return x + y;break; case '-': return x - y;break; case '*': return x * y;break; case '/': return x / y;break; default:break; } } int main(void) { string str;//输入字符串 while(cin >> str) { stack<char> opCh;//操作符栈 stack<double> opNum;//操作数栈 double ans = 0;//记录结果 int len = strlen(str.c_str());//字符串长度 //添加默认结束符 str[len] = ENDOFSTR; str[len+1] = '\0'; int i; for(i=0; i<=len; ++i)//遍历字符串 { char ch = str[i];//当前字符 if(ch>='0' && ch<='9')//为数字 { //获取到下一个空格的 int j = i; while(str[j]!='+' && str[j]!='-' && str[j]!='*' && str[j]!='/' &&str[j]!='#') { j++; } //组成数字 int itemp = 0; int k,exp = j-i-1; for(k=i; k<j; k++) { itemp += (str[k]-'0')*pow(10,exp--); } //压入 opNum.push(itemp); //遍历游标更新 i = j-1; } else //为字符 { //栈顶是否存在 if(opCh.empty())//不存在加入到符号栈直接 { opCh.push(ch); } else//存在 { if(mat[ch2pri(ch)][ch2pri(opCh.top())] == 1)//当前操作符比栈顶操作符优先级高 opCh.push(ch); else { //取数 while(!opCh.empty() && mat[ch2pri(ch)][ch2pri(opCh.top())] == 0)//存在再判定 { double pre, pro; pro = opNum.top(); opNum.pop(); pre = opNum.top(); opNum.pop(); //运算 double calnum = cal(pre,opCh.top(),pro); opNum.push(calnum); opCh.pop(); } opCh.push(ch); } } } if(!opCh.empty() && opCh.top()==ENDOFSTR && i==len)//完成全部计算 { ans = opNum.top();//结果 break; } } printf("%.0f\n",ans); } return 0; }
-
题目1101:计算表达式
最新推荐文章于 2022-11-05 08:45:02 发布
-
题目1101:计算表达式