网站备案要多少钱,WordPress固定链接跳转,苏州住房和城乡建设局网站网签,安徽网站建设方案服务描述 读入一个只包含 , -, *, / 的非负整数计算表达式#xff0c;计算该表达式的值。
输入描述#xff1a; 测试输入包含若干测试用例#xff0c;每个测试用例占一行#xff0c;每行不超过200个字符#xff0c;整数和运算符之间用一个空格分隔。没有非法表达式。当一行中…描述 读入一个只包含 , -, *, / 的非负整数计算表达式计算该表达式的值。
输入描述 测试输入包含若干测试用例每个测试用例占一行每行不超过200个字符整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束相应的结果不要输出。
输出描述 对每个测试用例输出1行即该表达式的值精确到小数点后2位。
样例输入
输入
1 2
4 2 * 5 - 7 / 11
0
样例输出
输出
3.00
13.36
思路
①设立运算符和运算数两个栈,一个用来存储运算符另一个用来存储运算数。
②在运算符栈中放置一个特殊运算符#,其优先级最低。
③将表达式尾部添加一个特殊运算符$,其优先级次低。
④从左至右依次遍历字符串若遍历到运算符则将其与运算符栈的栈顶元素进行比较若运算符栈的栈顶的优先级小于该运算符则将该运算符压入运算符栈若运算符栈的栈顶的优先级大于该运算符则弹出该栈顶运算符从运算数栈中依次弹出运算数完成弹出运算符对应的运算后再将该结果压入运算数栈。
⑤若遍历到表达式中的运算数则直接压入运算数栈。
⑥若运算符栈中仅剩两个特殊运算符#和$,则表达式运算结束此时运算数栈中唯一的数字就是表达式的值。
源代码
#includeiostream
#includestack
#includemap
#includestring
using namespace std;//例题5.6 KY129 简单计算器
//考虑到需要计算的数字可能不止一位就从检测到数字的索引开始一直到检测不到数字的索引这之间的就是一整个数字
double getNum(string str, int index) {double res 0;while (isdigit(str[index])) {res res * 10 str[index] - 0;index;}return res;
}//对两个数字进行运算
double cal(double x, double y, char op) {if (op ) {return x y;}else if (op -) {return x - y;}else if (op *) {return x * y;}else if (op /) {return x / y;}return 0;
}int main()
{//存储多个运算符号的优先级mapchar, int maps { {#,0},{$,1},{-,2},{,2}, {/,3},{*,3} };string s;//因为需要运算的式子可能不止一条这里用while循环//因为输入的式子中可能包含多个空格直接用getline(cin, s)回去整行的字符串并赋值给swhile (getline(cin, s)) {if (s 0) { //结束条件break;}stackchar symbol; // 存储运算符的栈stackdouble number; // 存储操作数的栈int index 0; //对字符串遍历的索引symbol.push(#); //把#压入符号中优先级最低s s $; //先把$放到要处理的公式字符串的末尾优先级次低while (index s.size()) { //遍历公式中的每一个字符//获取该数字索引开始的整个数字并压入栈number中if (isdigit(s[index])) { number.push(getNum(s, index));}//遇到公式中的空格直接跳过else if (s[index] ) {index;}else {//若运算符栈的栈顶的优先级小于遍历遇到的当前的运算符则将该运算符压入运算符栈if (maps[s[index]] maps[symbol.top()]) {symbol.push(s[index]);index;}//否则弹出该栈顶运算符从运算数栈中依次弹出运算数完成弹出运算符对应的运算后再将该结果压入运算数栈。else {double x number.top();number.pop();double y number.top();number.pop();char op symbol.top();symbol.pop();number.push(cal(y, x, op));}}}//精确到小数点后2位printf(%.2f\n, number.top());}return 0;
}
提交结果: