Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static infixToPostfix1(expression: string): string {
- let inf = (expression + ' $').split(" ");
- console.log("inf: ", inf);
- if (inf && inf.length) {
- /* Status будет иметь 3 состояния:
- * 0 - преобразование не выполнено, ошибка;
- * 1 - преобразование выполнено успешно;
- * 2 - преобразование в процессе */
- let status: number = 2;
- let i = 0;
- let lastOperator; //здесь будет храниться последний элемент в стеке
- let operators = [];
- let post = [];
- // массивы
- let mathArray = ['+', '-', '*', '/'];
- while (status === 2) {
- // if(i == 8) {
- // console.log("BREAK");
- // break;
- // }
- console.log("======== New step =========");
- console.log('current a[i]: ', inf[i]);
- lastOperator = operators[operators.length - 1] ? operators[operators.length - 1] : -1; // элемент на вершине стека (последний добавленный в стек элемент)
- console.log('First', lastOperator);
- console.log("operators: ", operators);
- console.log('post: ', post);
- // проверка, является ли элемент числом (с плавающей точкой или без нее) или %пере_менной%
- console.log('Проверка регуляркой: ', inf[i].match(/^[%\d\w]*[.,]?[%\d\w]+$/));
- if (inf[i].match(/^[%\d\w]*[.,]?[%\d\w]+$/) != null) {
- post.push(inf[i]);
- console.log('post: ', post);
- i++;
- }
- //если на стрелке + или -
- if (inf[i] == "+" || inf[i] == "-") {
- if (lastOperator == "-1" || lastOperator == "(") {
- operators.push(inf[i]);
- i++;
- } else {
- if (mathArray.indexOf(lastOperator) > -1)
- post.push(operators.pop());
- }
- }
- //если на стрелке * или /
- else if (inf[i] == "*" || inf[i] == "/") {
- if (lastOperator == "-1" || lastOperator == "(" || lastOperator == "+" || lastOperator == "-") {
- operators.push(inf[i]);
- i++;
- } else {
- if (lastOperator == "*" || lastOperator == "/") post.push(operators.pop());
- }
- }
- else if (inf[i] == "(") {
- operators.push(inf[i]);
- console.log('Operators: ', operators);
- i++;
- }
- else if (inf[i] == ")") {
- // если на стрелке закрывающая скобка, а в стеке нет элементов - изменяем стутус на 0 - ошибка
- if (lastOperator == "-1") status = 0;
- else if (mathArray.indexOf(lastOperator) > -1) {
- post.push(operators.pop());
- console.log('Operators -> post: ', operators, post);
- }
- else if (lastOperator == "(") {
- console.log('deleted ()');
- operators.pop();
- i++;
- }
- }
- else if (inf[i] == "$") {//если последний элемент
- if (lastOperator == "-1") status = 1; //преобразование из инфиксной нотации в постфиксную завершено
- else if (mathArray.indexOf(lastOperator) > -1) post.push(operators.pop());
- else if (lastOperator == "(") status = 0; // если на стрелке последний вагон, а в стеке есть открывающая скобка - ошибка
- }
- else status = 0; //неизвестный символ
- }
- if (status === 1)
- return post.join(" ");
- else
- return "0000";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement