前言:
21考研,不论能否进复试记录一下准备路上写下的垃圾代码。本来啃《算法笔记》,但是感觉太多了做不完,改做王道机试指南。
题目描述:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入描述
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出描述:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
解答
#include<iostream>
#include<string>
#include<vector>
#include<stack>
using namespace std;
void cal(stack<char>& sym,stack<double>& num) {
double right, left;
right = num.top();
num.pop();
left = num.top();
num.pop();
if (sym.top() == '+')
num.push(right + left);
else if (sym.top() == '-')
num.push(left - right);
else if (sym.top() == '*')
num.push(left * right);
else num.push(left / right);
sym.pop();
}
int main() {
string str,temp="";
getline(cin,str);
stack<double> num;
stack<char> sym;
double t = 0,left,right;
for (int i = 0; i < str.length(); i++) {
if (str[i] == ' ')
continue;
else if (str[i] >= '0' && str[i] <= '9') {
while (str[i] != ' ') {
temp += str[i];
i++;
if (i == str.length())
break;
}
num.push(stoi(temp));
temp = "";
}
else {
if (str[i] == '/' || str[i] == '*') {
if (sym.empty() == true || sym.top() == '+' || sym.top() == '-')
sym.push(str[i]);
else
{
while (sym.empty() == false && (sym.top() == '*' || sym.top() == '/'))
cal(sym, num);
sym.push(str[i]);
}
}
else {
while (sym.empty() == false)
cal(sym, num);
sym.push(str[i]);
}
}
}
while (sym.empty() == false)
cal(sym, num);
printf("%.2lf\n", num.top());
return 0;
}
学数据结构的时候学过,就带着印象复现了一下。