Друзья, а давайте организеум клуб неудачников "обращающие список" (для тех кто придавал вращательные движения всем этим спискам вокруг мпх, но на собесидование всё равно идти нада)
и будем тут выкладывать задачки специальной олимпиады, которые попались на интервью
Ну чтобы долго не разбираться а пробежался взглядом по списку, посмотрел что да как и пошёл рассказывать другим как программировать надо
внесу свой вклад
#чтото_там_про_(обратную?)_польскую_запись
#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;
}
_>bool parseInt(const std::string& s, int* val) // блин, а как нибудь попроще _>{ // в этом вашем си++ число из _> if (s.empty() || ( // строки зделать можно?
std::stoi(s)
Здравствуйте, Эйнсток Файр, Вы писали:
_>>Друзья, а давайте организеум клуб неудачников "обращающие список" ЭФ>Раздел уже есть на RSDN, что-то там про алгоритмы
этож не алгоритмы, это спец олимпиада
>> си число из строки ЭФ>atoi
ну а как этой atoi() "a" от "0" отличить?
Здравствуйте, TimurSPB, Вы писали:
_>>bool parseInt(const std::string& s, int* val) // блин, а как нибудь попроще _>>{ // в этом вашем си++ число из _>> if (s.empty() || ( // строки зделать можно? TSP>std::stoi(s)
у меня почти тоже самое
что то много приседаний вокруг этой stoi()
или try catch рисовать или ифом проверять что начинается с чего то похожего на цифру
Здравствуйте, borya_ilin, Вы писали:
_>Здравствуйте, Эйнсток Файр, Вы писали:
_>>>Друзья, а давайте организеум клуб неудачников "обращающие список" ЭФ>>Раздел уже есть на RSDN, что-то там про алгоритмы _>этож не алгоритмы, это спец олимпиада
>>> си число из строки ЭФ>>atoi _>ну а как этой atoi() "a" от "0" отличить?
1) проверить, что первый символ — число
2) использовать strtoi/strtol/strtoll и передавать в параметр endptr не NULL, потом сравнить этот указатель и исходную строку. Для десятичных чисел лучше использовать вариант 1) и atoi. Для других — использовать strtoi/strtol/strtoll и использовать тот способ проверки, который удобнее.
В случае если число выходит за диапазон, помещающийся в тип данных, то strtoi/strtol/strtoll выставляют errno.