Алгоритм сортировочной станции
Перейти к навигации
Перейти к поиску
Арифметические действия
vector<string> toPostfix(string &s) {
vector<string> postfix, stack;
string number;
for (char c : s) {
if (isdigit(c)) {
number += c;
} else {
if (!number.empty()) {
postfix.push_back(number);
number.clear();
}
if (!isspace(c)) {
while (!stack.empty() && (c == '+' || c == '-' || stack.back() == "*" || stack.back() == "/")) {
postfix.push_back(stack.back());
stack.pop_back();
}
stack.push_back(string(1, c));
}
}
}
if (!number.empty())
postfix.push_back(number);
postfix.insert(postfix.end(), stack.rbegin(), stack.rend());
return postfix;
}
Арифметические действия, скобки
vector<string> toPostfix(string &s) {
vector<string> postfix, stack;
string number;
for (char c : s) {
if (isdigit(c)) {
number += c;
} else {
if (!number.empty()) {
postfix.push_back(number);
number.clear();
}
if (c == '(') {
stack.push_back(string(1, c));
} else if (c == ')') {
while (stack.back() != "(") {
postfix.push_back(stack.back());
stack.pop_back();
}
stack.pop_back();
} else if (!isspace(c)) {
while (!stack.empty() && stack.back() != "(" && (c == '+' || c == '-' || stack.back() == "*" || stack.back() == "/")) {
postfix.push_back(stack.back());
stack.pop_back();
}
stack.push_back(string(1, c));
}
}
}
if (!number.empty())
postfix.push_back(number);
postfix.insert(postfix.end(), stack.rbegin(), stack.rend());
return postfix;
}
Вычисление значения выражения в постфиксной записи
int eval(const vector<string> &postfix) {
vector<int> stack;
for (const string &token : postfix) {
if (isdigit(token[0])) {
stack.push_back(stoi(token));
} else {
int b = stack.back();
stack.pop_back();
int &a = stack.back();
if (token == "+")
a += b;
else if (token == "-")
a -= b;
else if (token == "*")
a *= b;
else
a /= b;
}
}
return stack.back();
}