👩🏻💻 문제링크
https://www.acmicpc.net/problem/1918
1918번: 후위 표기식
첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 알파벳 대문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의
www.acmicpc.net
✍️ 아이디어
1. 문제 이해
- 책에서 배운 후위 표기법을 생각하면 되겠구만
- 우선순위 낮은 녀석(+ , -)이 스택 밑에 깔리고 높은 녀석(* , /)이 위로 올라감
2. 실수한점 : ( 가 나오면 우선순위 상관없이 무조건 스택에 넣었다가 )가 나와야만 연산자가 나올수 있다고 생각함
-> 이러한 생각으로 bool을 이용해서 ( 가 들어온 상태와 안들어온 상태를 나눌려고 했었는데 의미 없는 짓이었음
✍️소스코드
다른 사람들 코드도 다 비슷함
#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int main()
{
string exp; cin>>exp;
vector <char> result; //후위표기법을 저장할 공간
stack <char> stk;
for(char ch : exp)
{
if(ch>=65 && ch<=90) // 숫자이면 무조건 결과값에 넣음
{
result.push_back(ch);
}
else //연산자인 경우
{
if((ch == '+' || ch == '-') && !stk.empty()) // +, - 는 우선순위가 낮다
{
while(!stk.empty() && stk.top() != '(') //주의 !!!! (가 있다면 ( 전까지만 꺼내야한다
{
result.push_back(stk.top());
stk.pop();
}
stk.push(ch);
}
else if((ch == '*' || ch == '/') && !stk.empty())
{
while((stk.top() == '*' || stk.top() == '/') && !stk.empty() && stk.top() != '(')
{
result.push_back(stk.top());
stk.pop();
}
stk.push(ch);
}
else if(ch == '(') //( 가 나오면 일단 넣는다
{
stk.push(ch);
}
else if(ch == ')') //)면 괄호가 끝난거니까 무조건 안에 있는거 다 끄집어 내야함
{
while(!stk.empty() && stk.top() != '(')
{
result.push_back(stk.top());
stk.pop();
}
stk.pop();
}
else
{
stk.push(ch);
}
}
}
while(!stk.empty())
{
result.push_back(stk.top());
stk.pop();
}
for(auto iter = result.begin(); iter!= result.end(); iter++)
{
cout<<*iter;
}
cout<<'\n';
}
내가 헷갈렸던 부분 : while(!stk.empty() && stk.top() != '(') +나 -는 다 꺼내버릴수도 있으니까 ( 나오면 멈추게 설정해야함
체감난이도 | 걸린시간 | 참고 | 사용 문법 |
중상 | 1hour | x | 스택 |
'PS 연습' 카테고리의 다른 글
[DP] 백준 문제 풀이 - 15990 1,2,3 더하기 5 (0) | 2022.06.06 |
---|---|
[DP] 백준 문제 풀이 - 11726 2xN 타일링 (0) | 2022.06.06 |
[PS 풀이] 백준 문제 풀이 - 17298 오큰수 (0) | 2022.05.20 |
[백준] 백준 문제 풀이 - 11724 연결요소의 갯수 (0) | 2022.05.11 |
[백준] 백준 문제 풀이 - 1260 DFS/BFS (0) | 2022.05.11 |