보편적으로 많이 쓴느 식, 숫자와 숫자 사이에 연산자가 위치
1 + 2 = 3
1 x 2 = 2
숫자 사이에 연산자를 넣어주는 중위식과 달리 연산자가 뒤에 위치
1 2 + ==> 1 + 2
1 2 x ==> 1 x 2
자바스크립트의 배열을 스택으로 사용
연산자를 스택에 넣는다.
스택에 요소가 있을 경우 최상단 연산자의 우선순위와 현재 연산자의 우선순위를 비교한다.
최상단 연산자의 우선순위가 현재 연산자의 우선순위보다 작을 경우 현재 연산자를 스택에 넣는다.
(최상단 연산자 < 현재 연산자)
최상단 연산자의 우선순위가 현재 연산자의 우선순위보다 크거나 같은 경우
스택이 비거나 현재 연산자의 우선순위가 더 높을때까지 최상단 연산자를 스택에서 pop 하고 출력해준후
현재 연산자를 스택에 넣는다
(최상단 연산자 >= 현재 연산자)
우선순위 : 더하기 = 빼기 < 나누기 = 곱하기
infixToPostfix() {
const infix = this.infix.split(' ');
const stack = [];
let postfix = '';
for (let item of infix) {
if (!isNaN(Number(item))) postfix += ` ${item} `;
else {
const lastOperation = stack[stack.length - 1];
while (
stack.length &&
this.operationPriority[lastOperation] >=
this.operationPriority[item]
) {
postfix += ' ' + stack.pop() + ' ';
}
stack.push(item);
}
}
while (stack.length) {
postfix += ' ' + stack.pop() + ' ';
}
return postfix.split(' ').filter(item => item !== '');
}
자바스크립트의 배열을 스택으로 사용
computePostfix(postfix) {
const stack = [];
for (let item of postfix) {
if (!isNaN(Number(item))) stack.push(item);
else {
const rightNum = Number(stack.pop());
const leftNum = Number(stack.pop());
let newNum = 0;
switch (item) {
case '×':
newNum += leftNum * rightNum;
break;
case '÷':
newNum += leftNum / rightNum;
break;
case '+':
newNum += leftNum + rightNum;
break;
case '-':
newNum += leftNum - rightNum;
break;
}
stack.push(newNum);
newNum = 0;
}
}
return stack[0];
}