카테고리 없음
[Baekjoon] 1918번: 후위 표기식 (c++)
수기
2022. 3. 31. 19:55
https://www.acmicpc.net/problem/1918
1918번: 후위 표기식
첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 알파벳 대문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의
www.acmicpc.net
- 영대문자 A~Z가 들어오면 스택에 넣지 않고 바로 출력
- ( 들어오면 스택에 push
- ) 들어오면 스택에 top이 ( 가 될때까지 출력하면서 pop
- 연산자 * / + - 가 들어오면 스택의 top을 확인한 후, 우선순위를 정해 연산한다
- *와 /가 들어오면 스택의 top에 자신보다 우선순위가 높은 *와 /가 먼저 나올경우 스택의 top에 있는 연산자를 먼저 출력 후 pop , 스택의 top이 그 외의 값이라면 입력 그대로 스택에 push
- +와 /가 들어오면 스택의 top에 자신보다 우선순위가 높은 + - / * 가 먼저 나올경우 스택의 top에 있는 연산자를 먼저 출력 후 pop , 스택의 top이 그 외의 값이라면 입력 그대로 스택에 push
코드
#include <iostream>
#include <stack>
#include <string>
using namespace std;
//1918
int main()
{
string input;
stack<char> st;
cin >> input;
for(int i=0;i<input.length();i++){
if(input[i] >= 65 && input[i] <= 90) cout << input[i];
else {
if(input[i] == '('){
st.push('(');
}
else if(input[i] == ')'){
while(st.top() != '('){
cout << st.top();
st.pop();
}
st.pop(); // '(' 일때 pop만
}
else if(input[i] == '*' || input[i] == '/'){
while(!st.empty()){
if(st.top() == '*' || st.top() == '/'){
cout<<st.top();
st.pop();
}
else break;
}
st.push(input[i]);
}
else if(input[i] == '+' || input[i] == '-'){
while(!st.empty()){
if(st.top() == '*' || st.top() == '/' || st.top() == '-' || st.top() == '+'){
cout<<st.top();
st.pop();
}
else break;
}
st.push(input[i]);
}
}
}
while (!st.empty()) {
cout <<st.top();
st.pop();
}
return 0;
}