#include <iostream>
#include<queue>
#include<stack>
#include<string>
#include<map>
using namespace std;
struct node {
double number;
char operators;
int flag;
};
typedef struct node Node;
string str;
queue<Node> nodeq;
stack<Node> nodes;
map<char, int> priority;
void change() {
for (int j = 0; j < str.length(); ) {
if (str[j] >= '0' && str[j] <= '9') {
double number = 0.0;
while (str[j] >= '0' && str[j] <= '9') {
number = number * 10 + (double)(str[j] - '0');
j++;
}
Node* node = new Node;
node->number = number;
node->flag = 1;
nodeq.push(*node);
}
else {
Node* newnode = new Node;
newnode->operators = str[j];
newnode->flag = 2;
if (nodes.empty()) {
nodes.push(*newnode);
}
else {
Node node1 = nodes.top();
while (!nodes.empty() && priority[node1.operators] >= priority[str[j]]) {
nodeq.push(node1);
node1 = nodes.top();
nodes.pop();
}
nodes.push(*newnode);
}
j++;
}
}
while (!nodes.empty()) {
nodeq.push(nodes.top());
nodes.pop();
}
}
double cal() {
while (!nodeq.empty()) {
Node node = nodeq.front();
nodeq.pop();
if (node.flag == 1) {
nodes.push(node);
}
else {
Node node1 = nodes.top();
nodes.pop();
Node node2 = nodes.top();
nodes.pop();
if (node.operators == '+')
node2.number = node2.number + node1.number;
else if (node.operators == '-')
node2.number = node2.number - node1.number;
else if (node.operators == '*')
node2.number = node2.number * node1.number;
else
node2.number = node2.number / node1.number;
nodes.push(node2);
}
}
return nodes.top().number;
}
int main() {
cin >> str;
priority['*'] = priority['/'] = 2;
priority['+'] = priority['-'] = 1;
change();
cout << cal();
}
具体的思路(当计算式子中出现“()”)
- 左括号在进栈比较的时候优先级是最高的,不会弹出其他的元素,进栈后优先级是最低的,其他符号在他上边的时候,不会将他弹出
- 右括号进栈比较的时候优先级是最低的,栈内的元素会一直弹出,知道遇见左括号(这一点要另外判断)