Advertisement
Guest User

fav

a guest
Mar 21st, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  public static infixToPostfix1(expression: string): string {
  2.     let inf = (expression + ' $').split(" ");
  3.     console.log("inf: ", inf);
  4.     if (inf && inf.length) {
  5.       /* Status будет иметь 3 состояния:
  6.        * 0 - преобразование не выполнено, ошибка;
  7.        * 1 - преобразование выполнено успешно;
  8.        * 2 - преобразование в процессе */
  9.       let status: number = 2;
  10.  
  11.       let i = 0;
  12.       let lastOperator; //здесь будет храниться последний элемент в стеке
  13.       let operators = [];
  14.       let post = [];
  15.  
  16.       // массивы
  17.       let mathArray = ['+', '-', '*', '/'];
  18.  
  19.       while (status === 2) {
  20.         // if(i == 8) {
  21.         //   console.log("BREAK");
  22.         //   break;
  23.         // }
  24.         console.log("======== New step =========");
  25.         console.log('current a[i]: ', inf[i]);
  26.         lastOperator = operators[operators.length - 1] ? operators[operators.length - 1] : -1;  //  элемент на вершине стека (последний добавленный в стек элемент)
  27.         console.log('First', lastOperator);
  28.         console.log("operators: ", operators);
  29.         console.log('post: ', post);
  30.  
  31.         //  проверка, является ли элемент числом (с плавающей точкой или без нее) или %пере_менной%
  32.         console.log('Проверка регуляркой: ', inf[i].match(/^[%\d\w]*[.,]?[%\d\w]+$/));
  33.         if (inf[i].match(/^[%\d\w]*[.,]?[%\d\w]+$/) != null) {
  34.           post.push(inf[i]);
  35.           console.log('post: ', post);
  36.           i++;
  37.         }
  38.  
  39.         //если на стрелке + или -
  40.         if (inf[i] == "+" || inf[i] == "-") {
  41.           if (lastOperator == "-1" || lastOperator == "(") {
  42.             operators.push(inf[i]);
  43.             i++;
  44.           } else {
  45.             if (mathArray.indexOf(lastOperator) > -1)
  46.               post.push(operators.pop());
  47.           }
  48.         }
  49.         //если на стрелке * или /
  50.         else if (inf[i] == "*" || inf[i] == "/") {
  51.           if (lastOperator == "-1" || lastOperator == "(" || lastOperator == "+" || lastOperator == "-") {
  52.             operators.push(inf[i]);
  53.             i++;
  54.           } else {
  55.             if (lastOperator == "*" || lastOperator == "/") post.push(operators.pop());
  56.           }
  57.         }
  58.         else if (inf[i] == "(") {
  59.           operators.push(inf[i]);
  60.           console.log('Operators: ', operators);
  61.           i++;
  62.         }
  63.         else if (inf[i] == ")") {
  64.           // если на стрелке закрывающая скобка, а в стеке нет элементов - изменяем стутус на 0 - ошибка
  65.           if (lastOperator == "-1") status = 0;
  66.           else if (mathArray.indexOf(lastOperator) > -1) {
  67.             post.push(operators.pop());
  68.             console.log('Operators -> post: ', operators, post);
  69.           }
  70.           else if (lastOperator == "(") {
  71.             console.log('deleted ()');
  72.             operators.pop();
  73.             i++;
  74.           }
  75.         }
  76.         else if (inf[i] == "$") {//если последний элемент
  77.           if (lastOperator == "-1") status = 1; //преобразование из инфиксной нотации в постфиксную завершено
  78.           else if (mathArray.indexOf(lastOperator) > -1) post.push(operators.pop());
  79.           else if (lastOperator == "(") status = 0; // если на стрелке последний вагон, а в стеке есть открывающая скобка - ошибка
  80.         }
  81.         else status = 0; //неизвестный символ
  82.       }
  83.  
  84.       if (status === 1)
  85.         return post.join(" ");
  86.       else
  87.         return "0000";
  88.     }
  89.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement