https://www.acmicpc.net/problem/1918
해당문제는 예외처리를 통해서 해결했다.
크게 나눠야 하는부분은, stack에 push할때와 pop할때를 잘 구분해야한다.
1. 피연산자를 만날때 -> 바로 출력
2. 사칙연산일 경우 -> stack이 비어있을경우// stack의 top이 (일경우 //우선순위가 높은경우(ex. *,/ > +,-)일때 push한다.
-> 위에 경우들이 아니라면, 위에 경우가 나올때까지 pop(단, pop할때 바로 위에 경우가 걸린다면 해당 연산자를 넣고 break;
3. ( 괄호일 경우 -> push
4. ) 괄호일 경우 -> ( 이거나, 비어있을 때까지 pop한다.
#include<iostream>
using namespace std;
#include<string>
string input;
#include<stack>
//사칙연산자 push하는 경우
// 스택이 비어있거나, top이 여는 괄호거나.
// 이번 연산자> top연산자
// 그외에는 pop
stack <char> s;
//42 -> * , 43 -> + , 45 -> - ,47-> /
int main()
{
cin >> input;
char cmp;
for (int i = 0; i < input.size(); i++)
{
cmp = input[i];
if (cmp == 42 || cmp == 43 || cmp == 47
|| cmp == 45) //사칙연산의 경우
{
if (s.empty())
s.push(cmp);
else if (s.top() == 40)
{
s.push(cmp);
}
else if ((s.top() == 43 || s.top() == 45) && (cmp == 42 || cmp == 47))
{ //top보다 우선순위가 높을 경우
s.push(cmp);
}
else {
while (1)
{
if (s.top() != 40 || s.top()!=41)
{
cout << s.top();
s.pop();
}
else
{
s.pop();
}
if (s.empty())
{
s.push(cmp);
break;
}
else if (s.top() == 40)
{
s.push(cmp);
break;
}
else if ((s.top() == 43 || s.top() == 45) && (cmp == 42 || cmp == 47))
{ //top보다 우선순위가 높을 경우(즉, top(*, /) > cmp(+,-)
s.push(cmp);
break;
}
else
{
if (s.top() != 40 || s.top() != 41)
{
cout << s.top(); s.pop();
}
else
{
s.pop();
}
s.push(cmp);
break;
}
}
}
}
else if (cmp == 40) //여는 괄호
{
s.push(cmp);
}
else if (cmp == 41) //닫는 괄호시
{
while (1)
{
if (s.empty()) break;
if (s.top() == 40)
{
s.pop();
break;
}
else if (s.top() != 40 || s.top() != 41)
{
cout << s.top();
s.pop();
}
}
}
else //피연산자 일경우
{
cout << cmp;
}
}
while (!s.empty())
{
if(s.top()!=40 || s.top()!=41)
{
cout << s.top();
s.pop();
}
else
{
s.pop();
}
}
return 0;
}
'백준_문제풀이' 카테고리의 다른 글
[백준]: 5557번: 1학년 / DP(동적프로그래밍) (0) | 2018.09.27 |
---|---|
[백준]: 2841번: 외계인의 기타연주 / Stack & pair (0) | 2018.09.26 |
[백준]: 12842번: 튀김 소보루 / 단순 반복 (0) | 2018.09.16 |
[백준]: 2150번: Strongly Connected Component / 코사리주 알고리즘 (0) | 2018.09.16 |
[백준]: 2573번: 빙산 / DFS & BFS (0) | 2018.09.13 |