задачки с собеседований
От: 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.