Задача 12 Урок 18 (Задача 1 [!] Pascal.js Алгоритмическая практика. )

Задача 1 [!] Pascal.js Алгоритмическая практика.:

Решите на Паскале и/или JS Задачку №12 Урока 18, про расчет выражений вида за один проход строки:

Задача 12 Урок 18:

Задана последовательность символов, имеющая следующий вид:
p1q1p2q2p3...qn–1pn, где pi — число, а qi — знак арифметического действия из набора {+, –, *}. Вычислите значение выражения, предполагая, что действия выполняются согласно правилам арифметики.

Входные данные: На вход программе подается строка указанного вида, состоящая не более чем из 9 чисел, разделенных символами арифметических операций.

Выходные данные: Выведите значение арифметического выражения.
Примеры:

Входные данные   Результат 
 
5+2               7
1-2*5+2          -7
5*6+7-3*2+11      42
5*6+7-3*2*3+11    30

Как решать: Посчитайте результат за одно прочтение строки, без использования массивов

Решение:

var
  i, temp, res, num, n, code: integer;
  s: string;
  prevOp, currOp: char;

begin
  s := '5*6+7-3*2*3+11';
  currOp := ' ';
  prevOp := '+';
  res := 0;
  temp := 0;
  num := 0;
  i := 1;


  while(i <= length(s)) do
  begin
    val(s[i], n, code);

    while (code = 0) do
    begin
      num := num * 10 + n;
      inc(i);
      val(s[i], n, code);
    end;

    if (s[i] = '*') then
    begin
      currOp := '*';
      if (temp = 0) then
        temp := num
      else
        temp *= num;
      num := 0;
    end;

    if ((s[i] = '+') or (s[i] = '-') or (i >= length(s))) then
    begin
      if (currOp = '*') then
        temp *= num
      else
        temp := num;

      case prevOp of
      '+': res += temp;
      '-': res -= temp;
      end;

      prevOp := s[i];
      temp := 0;
      num := 0;
      currOp := ' ';
    end;
    inc(i);
  end;

  writeln(res);

  readln();
end.

Вывод консоли:

Входные данные   Результат

5+2               7
1-2*5+2          -7
5*6+7-3*2+11      42
5*6+7-3*2*3+11    30