Advertisement
Guest User

Untitled

a guest
Nov 21st, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.36 KB | None | 0 0
  1. program Project2;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils, Windows;
  7.  
  8. type
  9.    StackElPT = ^TStack;
  10.  
  11.    TStack = record
  12.       Elem: Char;
  13.       Next: StackElPT;
  14.    end;
  15.  
  16. //Добавление к стеку st элемента value
  17. procedure Push(var st: StackElPT; value: Char);
  18. var
  19.    x: StackElPT;
  20. begin
  21.    New(x);          //Добавляемый элемент
  22.    x^.Elem := value;
  23.    x^.next := st;     //Стек строим так, что next ссылатся на то, что положили ранше
  24.    st := x;
  25. end;
  26.  
  27. //Забрать из стека верхний элемент
  28. function Pop(var st: StackElPT): Char;
  29. begin
  30.    if st <> nil then
  31.    begin
  32.       Pop := st^.Elem;
  33.       st := st^.next;     //Убираем элемент из стека
  34.    end
  35.    else
  36.       Pop := #0;        //Для пустого стека возвращаем символ #0
  37. end;
  38.  
  39. //Получить стековый пиоритет символа с
  40. function StackPriority(c: Char): Integer;
  41. begin
  42.    case c of
  43.       '+', '-':
  44.          Result := 2;
  45.       '*', '/':
  46.          Result := 4;
  47.       '^':
  48.          Result := 5;
  49.       'a'..'z', 'A'..'Z':
  50.          Result := 8;
  51.       '(':
  52.          Result := 0;
  53.       else
  54.          Result := 10;     //Для неизвестного символа возвращаем 10
  55.    end;
  56. end;
  57.  
  58. //Получить отнсительный пиоритет символа с
  59. function InpPriority(c: Char): Integer;
  60. begin
  61.    case c of
  62.       '+', '-' :
  63.          Result := 1;
  64.       '*', '/' :
  65.          Result := 3;
  66.       '^' :
  67.          Result := 6;
  68.       'a'..'z', 'A'..'Z':
  69.          Result := 7;
  70.       '(':
  71.          Result := 9;
  72.       ')':
  73.          Result := 0;
  74.       else
  75.          Result := 10;       //Для неизвестного символа возвращаем 10
  76.    end;
  77. end;
  78.  
  79. //Возвращает ранг символа в польской записи
  80. function CharRang(c: Char): Integer;
  81. begin
  82.    if c in ['a'..'z', 'A'..'Z'] then
  83.       Result := 1                          //Для операнда ранг 1
  84.    else
  85.       Result := -1;                        //Для оператора -1
  86. end;
  87.  
  88. var
  89.    st: StackElPT;
  90.    input, output: string;
  91.    rang, i: Integer;
  92.    t: Char;
  93. begin
  94.    st := nil;     //Сделали стек пустым
  95.    rang := 0;     //Обнуляем ранг
  96.    output := '';  //И входную строку
  97.    WriteLn('Введите выражение: ');
  98.    Readln(input);
  99.    i := 1;
  100.    while i <= Length(input) do //i Может измениться не после каждой итерации (Не for)
  101.    //Стек пуст или верхний элемнт стека имеет менщий приоритет
  102.       if  (st = nil) or (InpPriority(Input[i]) > StackPriority(st^.Elem)) then
  103.       begin
  104.          if Input[i] <> ')' then  // ( в стек ложить не надо
  105.             Push(st,input[i]); //Ложим входной символ в стек
  106.          Inc(i);                //След. символ
  107.       end
  108.       //Стек не пуст и приоритет входного символа меньше
  109.       else
  110.       begin
  111.          t := Pop(st);
  112.          if Input[i] = ')' then
  113.             while t <> '(' do
  114.                t := Pop(st)
  115.                    //Забираем из стека верний символ
  116.          else if t <> '(' then //( Добавлять в езултат не надо
  117.          begin
  118.             output := output + t;           //Дописываем к выходной строке
  119.             rang := rang + CharRang(t); //Изменяем ранг выражения
  120.          end;
  121.          //К след символу входной строи не переходим
  122.       end;
  123.  
  124.    //Дописываем всё что осталось в стеке
  125.    while not (st = nil) do
  126.    begin
  127.       t := Pop(st);      //Забираем из стека верний символ
  128.       if t <> '(' then
  129.       begin   //( Добавлять в резултат не надо
  130.          output := output + t;  //Дописываем к выходной строке
  131.          rang := rang + CharRang(t);
  132.       end;
  133.    end;
  134.  
  135.    WriteLn('Постфиксная форма: ');
  136.    Writeln(output);
  137.    Write('Ранг выражения: ');
  138.    Writeln(rang);
  139.    Readln;
  140. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement