단, 조항을 잘읽어야하는 문제이다. 중간 과정에서 연산을 실수연산으로 하고 최종결과값만 정수부를 출력해야한다. 테스트 케이스 중에 1 / 0.5 같은 연산도 존재하기 때문에 이 예외를 처리하지 않으면 Divided by Zero 런타임 에러가 발생할 수 있다.
그리고 입력이 굉장히 까다로웠다. cin으로 사용하기 위해서는 getline함수이나 그냥 cin을 이용해서 한줄을 모두 받아들이는 방법이 좋고, 나는 printf와 getchar를 이용해서 적절하게 버퍼에 데이터를 순차적으로 읽어들였다.
그리고 Stack을 활용했을 때 굉장히 주의해야할 점을 무시해서 스택 top index가 계속 -1보다 작은 경우가 발생하는 에러를 핸들링하지 못해서 고생했다.
Class는 다양한 대입연산, 복사생성자등 많은 연산을 지원하지만 구조체는 유일하게 대입연산을 지원한다.
=> 구조체는 함수에서 인자로 많이 넘겨지고 Return값으로도 많이 쓰이기 때문이다. Cally by value를 지원하기 위해 사용된다.
후위연산을 할때 굳이 Stack을 사용할 필요없이 계산값을 return하여 계산할 수 있다.
#include <iostream>
using namespace std;
enum child { DATA = 0, LEFT = 1, RIGHT = 2 };
bool isOp[256]{ 0, };
int stack[1001]{ 0, };
int top = -1;
int arr[1000][3]{ 0, };
void postOrder(int node) {
if (arr[node][DATA] == 0) return;
postOrder(arr[node][LEFT]);
postOrder(arr[node][RIGHT]);
if (arr[node][LEFT] != 0 && arr[node][RIGHT] != 0) {
if (top < 1) {
cout << endl;
}
switch (arr[node][DATA]) {
case '-':
stack[top - 1] = stack[top - 1] - stack[top];
break;
case '+':
stack[top - 1] = stack[top - 1] + stack[top];
break;
case '*':
stack[top - 1] = stack[top - 1] * stack[top];
break;
case '/':
if (stack[top] == 0) {
cout << endl;
}
stack[top - 1] = stack[top - 1] / stack[top];
break;
}
top--;
}
else {
stack[++top] = arr[node][DATA];
}
}
int main() {
//freopen("Text.txt" , "r" , stdin);
//data, left, right
isOp['-' ] = true;
isOp['*' ] = true;
isOp['+' ] = true;
isOp['/' ] = true;
for (int t = 0; t < 10; t++) {
int nCount;
scanf("%d", &nCount);
getchar();
for (int i = 0; i < nCount; i++) {
int node_num;
scanf("%d",&node_num);
char a= getchar();
char op;
op = getchar();
if (isOp[op]) {
//operator
int left, right;
getchar();
scanf("%d %d", &left, &right);
char b= getchar();
arr[node_num][DATA] = op;
arr[node_num][LEFT] = left;
arr[node_num][RIGHT] = right;
}
else {
op = (op - '0');
int operand ;
int sum = op;
while ((operand = getchar())!= '\n') {
sum *= 10;
sum += (operand-'0');
}
arr[node_num][DATA] = sum;
}
}
postOrder(1);
cout <<"#"<<t+1<<" "<< stack[top]<< endl;
fill_n(stack, 1000, 0);
top = -1;
for (int k = 0; k < 1000; k++) {
arr[k][DATA] = 0;
arr[k][LEFT] = 0;
arr[k][RIGHT] = 0;
}
}
return 0;
}
'자료구조 > SW Expert Academy' 카테고리의 다른 글
1267 - 작업순서 (0) | 2021.04.09 |
---|---|
2948. 문자열 교집합 (0) | 2021.04.08 |
[SW Expert Academy]1257 - K번째 문자열 (1) | 2021.04.06 |
SW acadeny 1265 달란트2 (0) | 2021.03.29 |
SW academy 1244 최대 상금 (0) | 2021.03.25 |