//첫번째 오답 코드
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
stack<char> stk;
string st, ans = "";
char tmp;
cin >> st;
bool flag = true; //앞 부호가 * 또는 / 일때 false
bool braket = true; // 브라켓이 false일때만 괄호안에 있는 상태
for (int i = 0; i < st.length(); i++) {
stk.push(st[i]);
switch (stk.top()) {
case '(':
braket = false;
break;
case ')':
if (braket == false) {
while (!stk.empty()) {
if (stk.top() == '(' || stk.top() == ')')
stk.pop();
else {
ans += stk.top();
stk.pop();
}
}
braket = true;
}
break;
case '*': case '/':
flag = false;
break;
case '+': case '-':
if (flag == false) { //전 부호가 /, *일때 바로 스택순서대로 팝
tmp = stk.top();
stk.pop();
while (!stk.empty()) {
ans += stk.top();
stk.pop();
}
stk.push(tmp);
flag = true;
}
break;
default: //연산자와 괄호가 아닐때 바로 ans에 넣어주고 pop
ans += stk.top();
stk.pop();
break;
}
}
while (!stk.empty()) {
ans += stk.top();
stk.pop();
}
cout << ans << "\n";
}
첫번째 코드를 생각 했을때 bool를 사용해서 해당 신호가 false되면
처리하는 방법으로 생각하여 코드를 짜게 되었다.
하지만, 입력된 값으로 처리하는게 bool의 변화로 스택pop,push하는 거보다 더 편리하고 가볍다는걸 알수 있게 되었다.
2번째 코드 (다른사람의 코드를 참고해서 바꿨습니다)
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
stack<char> stk;
string st;
cin >> st;
for (int i = 0; i < st.length(); i++) {
switch (st[i]) {
case '(':
stk.push(st[i]);
break;
case ')':
while (!stk.empty() && stk.top() != '(') { // top값이 (가 아닐때까지 스택을 비우는 행위를 한다
cout << stk.top();
stk.pop();
}
stk.pop(); // ( << 를 pop
break;
case '+': case '-':
while (!stk.empty() && stk.top() != '(') {
cout << stk.top();
stk.pop();
}
stk.push(st[i]);
break;
case '*': case '/':
while (!stk.empty() && (stk.top() == '*' || stk.top() == '/')) {
cout << stk.top();
stk.pop();
}
stk.push(st[i]);
break;
default:
cout << st[i];
break;
}
}
while (!stk.empty()) {
cout << stk.top();
stk.pop();
}
}
