задачки с собеседований
От: borya_ilin  
Дата: 28.11.18 16:09
Оценка: :)
Друзья, а давайте организеум клуб неудачников "обращающие список" (для тех кто придавал вращательные движения всем этим спискам вокруг мпх, но на собесидование всё равно идти нада)
и будем тут выкладывать задачки специальной олимпиады, которые попались на интервью
Ну чтобы долго не разбираться а пробежался взглядом по списку, посмотрел что да как и пошёл рассказывать другим как программировать надо

внесу свой вклад

#чтото_там_про_(обратную?)_польскую_запись
#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;
}
Re: задачки с собеседований
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 28.11.18 16:23
Оценка:
_>Друзья, а давайте организеум клуб неудачников "обращающие список"
Раздел уже есть на RSDN, что-то там про алгоритмы

> си число из строки

atoi
Re: задачки с собеседований
От: TimurSPB Интернет  
Дата: 28.11.18 17:41
Оценка:
_>bool parseInt(const std::string& s, int* val) // блин, а как нибудь попроще
_>{ // в этом вашем си++ число из
_> if (s.empty() || ( // строки зделать можно?
std::stoi(s)
Make flame.politics Great Again!
Re[2]: задачки с собеседований
От: borya_ilin  
Дата: 28.11.18 18:23
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

_>>Друзья, а давайте организеум клуб неудачников "обращающие список"

ЭФ>Раздел уже есть на RSDN, что-то там про алгоритмы
этож не алгоритмы, это спец олимпиада

>> си число из строки

ЭФ>atoi
ну а как этой atoi() "a" от "0" отличить?
Re[2]: задачки с собеседований
От: borya_ilin  
Дата: 28.11.18 18:28
Оценка:
Здравствуйте, TimurSPB, Вы писали:

_>>bool parseInt(const std::string& s, int* val) // блин, а как нибудь попроще

_>>{ // в этом вашем си++ число из
_>> if (s.empty() || ( // строки зделать можно?
TSP>std::stoi(s)
у меня почти тоже самое
что то много приседаний вокруг этой stoi()
или try catch рисовать или ифом проверять что начинается с чего то похожего на цифру
Re[3]: задачки с собеседований
От: AleksandrN Россия  
Дата: 30.11.18 11:53
Оценка:
Здравствуйте, borya_ilin, Вы писали:

_>Здравствуйте, Эйнсток Файр, Вы писали:


_>>>Друзья, а давайте организеум клуб неудачников "обращающие список"

ЭФ>>Раздел уже есть на RSDN, что-то там про алгоритмы
_>этож не алгоритмы, это спец олимпиада

>>> си число из строки

ЭФ>>atoi
_>ну а как этой atoi() "a" от "0" отличить?

1) проверить, что первый символ — число
2) использовать strtoi/strtol/strtoll и передавать в параметр endptr не NULL, потом сравнить этот указатель и исходную строку. Для десятичных чисел лучше использовать вариант 1) и atoi. Для других — использовать strtoi/strtol/strtoll и использовать тот способ проверки, который удобнее.

В случае если число выходит за диапазон, помещающийся в тип данных, то strtoi/strtol/strtoll выставляют errno.

В C++ использовать std::stoi и ловить исключение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.