计算表达式(上交复试上机)
程序员文章站
2024-02-17 11:58:52
...
前言:
21考研,不论能否进复试记录一下准备路上写下的垃圾代码。本来啃《算法笔记》,但是感觉太多了做不完,改做王道机试指南。
题目描述:
对于一个不存在括号的表达式进行计算
输入描述
存在多种数据,每组数据一行,表达式不存在空格
输出描述:
输出结果
解答
#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] >= '0' && str[i] <= '9') {
while (str[i] >= '0' && str[i] <= '9') {
temp += str[i];
i++;
if (i == str.length())
break;
}
num.push(stoi(temp));
temp = "";
i--;
}
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("%.0lf\n", num.top());
return 0;
}