算法笔记练习 题解合集
题目
题目描述
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92
0
样例输出
12178.21
思路
主要思路就是把中缀表达式转换成后缀表达式,再对后缀表达式求值。详细思路见算法笔记 P247。
代码
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <stack>
using namespace std;
const string PRIOR = "+-*/";
struct Node {
bool flag;
double num;
char op;
};
void getPostfix(string& infix, vector<Node>& postfix) {
stack<Node> opStack;
Node temp;
int p = 0, q;
infix += " ";
do {
q = p;
while (infix[q] != ' ')
++q;
string sub = infix.substr(p, q - p);
if (isdigit(sub[0])) {
temp.flag = true;
temp.num = stod(sub);
postfix.push_back(temp);
} else {
temp.flag = false;
temp.op = sub[0];
while (!opStack.empty() && PRIOR.find(temp.op) <= PRIOR.find(opStack.top().op)) {
postfix.push_back(opStack.top());
opStack.pop();
}
opStack.push(temp);
}
p = ++q;
} while (q != infix.size());
while (!opStack.empty()) {
postfix.push_back(opStack.top());
opStack.pop();
}
}
double calculatePostfix(vector<Node>& postfix) {
double a, b, c;
stack<double> numStack;
for (int i = 0; i < postfix.size(); ++i) {
if (postfix[i].flag)
numStack.push(postfix[i].num);
else {
b = numStack.top();
numStack.pop();
a = numStack.top();
numStack.pop();
c = (postfix[i].op == '+' ? a + b :
postfix[i].op == '-' ? a - b :
postfix[i].op == '*' ? a * b :
postfix[i].op == '/' ? a / b : 0);
numStack.push(c);
}
}
return numStack.top();
}
int main() {
string infix;
while (getline(cin, infix) && infix != "0") {
vector<Node> postfix;
getPostfix(infix, postfix);
printf("%.2lf\n", calculatePostfix(postfix));
}
return 0;
}