KU COSE101 2019기말대비 연습문제 5번
2019 연습 | 1번 | 2번 | 3번 | 4번 | 5번 |
다음과 같은 계산 식이 있다.
5 + 10 - 7 * 3 / 2
위와 같은 계산식을 Linked List를 이용하여 입력 한 뒤, 계산하시오. 단, 각 숫자는 20 이하이다.
struct calc{
int num;
char oper;
struct calc* next;
};
typedef struct calc calc;
typedef calc *calcPtr;
값을 대입하는 insert함수는 다음과 같다.
void insert(calcPtr sPtr, int val, char op);
해를 구하는 solve함수는 다음과 같다.
int solve(calcPtr sPtr);
main함수의 구조는 다음과 같다.
int main()
{
calcPtr head = (calcPtr)malloc(sizeof(calc));
head->next = NULL;
char a[100];
gets(a);
//삽입하는 부분
printf("%d", solve(head));
}
계산은 int형으로만 진행된다. (ex) 3/2 = 1)
연산자 우선순위는 (곱셈, 나눗셈), (덧셈, 뺄셈)순서이다. (괄호는 없다)
위 계산은 다음과 같이 진행되어야 한다.
5 + 10 - 7 * 3 / 2
5 + 10 - 21 / 2
5 + 10 - 10
15 - 10
5
예시답안
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct calc{
int num;
char oper;
struct calc* next;
};
typedef struct calc calc;
typedef calc *calcPtr;
int solve(calcPtr sPtr) {
calcPtr prevPtr = sPtr;
calcPtr curPtr = sPtr->next;
while(curPtr != NULL){
while(curPtr->oper == '*' || curPtr->oper == '/'){
if(curPtr->oper == '*'){
curPtr->num *= curPtr->next->num;
}
if(curPtr->oper == '/'){
curPtr->num /= curPtr->next->num;
}
curPtr->oper = curPtr->next->oper;
curPtr->next = curPtr->next->next;
}
prevPtr = curPtr;
curPtr = curPtr->next;
}
prevPtr = sPtr;
curPtr = sPtr->next;
while(curPtr != NULL){
while(curPtr->oper == '+' || curPtr->oper == '-'){
if(curPtr->oper == '+'){
curPtr->num += curPtr->next->num;
}
if(curPtr->oper == '-'){
curPtr->num -= curPtr->next->num;
}
curPtr->oper = curPtr->next->oper;
curPtr->next = curPtr->next->next;
}
prevPtr = curPtr;
curPtr = curPtr->next;
}
return sPtr->next->num;
}
void insert(calcPtr sPtr, int val, char op)
{
calcPtr newPtr = (calcPtr)malloc(sizeof(calc));
newPtr->num = val;
newPtr->oper = op;
newPtr->next = NULL;
calcPtr curPtr = sPtr;
while(curPtr != NULL){
if(curPtr->next == NULL){
curPtr->next = newPtr;
break;
}
curPtr = curPtr->next;
}
}
int main()
{
calcPtr head = (calcPtr)malloc(sizeof(calc));
head->next = NULL;
char a[100];
gets(a);
char* temp = strtok(a, " ");
int tv;
char to;
while(temp!=NULL){
tv = atoi(temp);
temp = strtok(NULL," ");
if(temp==NULL){
insert(head, tv, 0);
break;
}
to = temp[0];
temp = strtok(NULL," ");
insert(head, tv, to);
}
printf("%d", solve(head));
}
Comments