Алгоритм сортировочной станции: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) Нет описания правки |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
| Строка 1: | Строка 1: | ||
== Арифметические действия == | |||
vector<string> toPostfix(string &s) { | vector<string> toPostfix(string &s) { | ||
vector<string> postfix, stack; | vector<string> postfix, stack; | ||
| Строка 14: | Строка 14: | ||
} | } | ||
if (!isspace(c)) { | if (!isspace(c)) { | ||
while (!stack.empty() && | while (!stack.empty() && (c == '+' || c == '-' || stack.back() == "*" || stack.back() == "/")) { | ||
postfix.push_back(stack.back()); | postfix.push_back(stack.back()); | ||
stack.pop_back(); | stack.pop_back(); | ||
| Строка 30: | Строка 29: | ||
return postfix; | 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) { | int eval(const vector<string> &postfix) { | ||
vector<int> stack; | vector<int> stack; | ||
| Строка 56: | Строка 96: | ||
return stack.back(); | return stack.back(); | ||
} | } | ||
==Ссылки== | ==Ссылки== | ||
Текущая версия от 19:36, 13 февраля 2023
Арифметические действия
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();
}