✅ stack
괄호의 존재 유무에 따라, 또 연산자 우선순위(*, / 가 +, - 보다 먼저)에 따라 연산자 순서가 달라지는 문제다.
위에서 말한 이유로 인해 stack에 우선순위가 낮은 연산자들을 담아 놨다가 우선순위가 높은 연산자를 출력한 후 그 다음 꺼내와야 한다.
// stack : 연산자를 담아놓을 스택, str : 주어진 표기식
cin >> str
for(i : str인덱스){
if(str[i] == A ~ Z){
vector.push_back(str[i])
}
if(str[i] == + or -){
while(!stack.empty and str[i]!='('){
vector.push_back(stack.top)
stack.pop
}
vector.push_back(str[i])
}
if(str[i] == * or /){
while(!stack.empty and (stack.top == * or stack.top == /)){
vector.push_back(stack.top)
stack.pop
}
vector.push_back(str[i])
}
if(str[i] == '('){
vector.push_back(str[i])
}
if(str[i] == ')'){
while(!stack.empty and stack.top != '('){
vector.push_back(stack.top)
stack.pop
}
stack.pop // '(' 제거
}
}
while(!stack.empty){ // 마지막에 남아있는 연산자 제거
vector.push_back(stack.top)
stack.pop
}
print(vector) // 후위 표기식 출력
O(N^2)
이전 후위표기식을 계산하는 문제에서도 stack을 사용했기 때문에 stack을 떠올리는 것은 어렵지 않았다.
하지만 이전 문제에서는 피연산자를 stack에 담아 활용했지만 이번 문제는 연산자의 순서가 바뀌므로 연산자를 stack에 담아 활용해야 한다는 점과
연산자의 종류에 따라 stack에서 pop해줄때 조건들을 떠올리기 쉽지 않았다.