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;

}

+ Recent posts