Друзья, а давайте организеум клуб неудачников "обращающие список" (для тех кто придавал вращательные движения всем этим спискам вокруг мпх, но на собесидование всё равно идти нада)
и будем тут выкладывать задачки специальной олимпиады, которые попались на интервью
Ну чтобы долго не разбираться а пробежался взглядом по списку, посмотрел что да как и пошёл рассказывать другим как программировать надо
внесу свой вклад
#чтото_там_про_(обратную?)_польскую_запись
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <cstdlib>
bool parseInt(const std::string& s, int* val) // блин, а как нибудь попроще
{ // в этом вашем си число из
if (s.empty() || ( // строки зделать можно?
(!isdigit(s[0])) &&
(s[0] != '-') &&
(s[0] != '+')
)
) {
return false;
}
char * p;
*val = std::strtol(s.c_str(), &p, 10);
return (*p == 0);
}
bool foo(const std::string expr, int* res)
{
std::vector<int> stack;
std::stringstream ss(expr);
std::string tkn;
while (getline(ss, tkn, ' ')) {
if (tkn.empty()) {
continue;
}
int intVal;
if (parseInt(tkn, &intVal)) {
stack.push_back(intVal);
} else {
if (stack.size() < 2) {
return false;
}
int a = stack.back();
stack.pop_back();
if (tkn == "+") {
stack.back() += a;
} else if (tkn == "-") {
stack.back() -= a;
} else if (tkn == "/") {
stack.back() /= a;
} else if (tkn == "*") {
stack.back() *= a;
} else {
return false;
}
}
}
if (stack.size() != 1) {
return false;
}
*res = stack.back();
return true;
}
int main()
{
int res;
if (foo(" 1 1 + 2 3 * - ", &res)) {
std::cout << res << std::endl;
}
return 0;
}