문제
main문에서 주어진 수식을 후위식으로 변환 후 변환 된 수식을 후위계산하여 값을 출력하시오
풀이
수식을 후위식으로 변환하는 함수부터 진행하기 때문에 스택의 요소는 char형 입니다.
일반적인 후위변환식을 작성하고, push,pop,peek등의 스택의 기본적인 연산 함수를 그대로 이용하여 후위계산을 하려면
스택의 요소를 int형으로 바꿔주어야하는데(숫자가 스택에 push되므로)
스택에 push할 때 char형을 int형으로 형변환하여 push하는 것 외에 일반적인 수식계산 함수와 다를 게 없습니다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | // C program to convert infix expression to postfix #pragma warning(disable:4996) #include <stdio.h> #include <string.h> #include <stdlib.h> // Stack type struct Stack { int top; unsigned capacity; int* array; }; // Stack Operations struct Stack* createStack(unsigned capacity) { struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack)); if (!stack) return NULL; stack->top = -1; stack->capacity = capacity; stack->array = (int*)malloc(stack->capacity * sizeof(int)); return stack; } int isEmpty(struct Stack* stack) { return stack->top == -1; } char peek(struct Stack* stack) { return stack->array[stack->top]; } char pop(struct Stack* stack) { if (!isEmpty(stack)) return stack->array[stack->top--]; return '$'; } void push(struct Stack* stack, char op) { stack->array[++stack->top] = op; } // A utility function to check if the given character is operand int isOperand(char ch) { return (ch >= '0' && ch <= '9'); } // A utility function to return precedence of a given operator // Higher returned value means higher precedence int Prec(char ch) { switch (ch) { case '+': case '-': return 1; case '*': case '/': return 2; case '^': return 3; } return -1; } // The main function that converts given infix expression // to postfix expression. void infixToPostfix(char* exp) { int i, k; // Create a stack of capacity equal to expression size struct Stack* stack = createStack(strlen(exp)); if (!stack) // See if stack was created successfully return;//오류 for (i = 0, k = -1; exp[i]; ++i) { // If the scanned character is an operand, add it to output. if (isOperand(exp[i])) exp[++k] = exp[i]; // If the scanned character is an ‘(‘, push it to the stack. else if (exp[i] == '(') push(stack, exp[i]); // If the scanned character is an ‘)’, pop and output from the stack // until an ‘(‘ is encountered. else if (exp[i] == ')') { while (!isEmpty(stack) && peek(stack) != '(') exp[++k] = pop(stack); if (!isEmpty(stack) && peek(stack) != '(') return; // invalid expression //오류 else pop(stack); } else // an operator is encountered { while (!isEmpty(stack) && Prec(exp[i]) <= Prec(peek(stack))) exp[++k] = pop(stack); push(stack, exp[i]); } } // pop all the operators from the stack while (!isEmpty(stack)) exp[++k] = pop(stack); exp[++k] = '\0'; printf("%s\n", exp); } int eval(char* exp) { struct Stack* stack = createStack(strlen(exp)); if (!stack) // See if stack was created successfully exit(1); int op1, op2, n; char ch; n = strlen(exp); for (int i = 0; i < n; i++) { ch = exp[i]; //숫자일 떄 if (ch != '+' && ch != '-' && ch != '*' && ch != '/') push(stack, ch-'0'); else { op2 = pop(stack); op1 = pop(stack); switch (ch) { case '+': push(stack, op1 +op2); break; case '-':push(stack, op1 -op2); break; case '*':push(stack, op1 *op2); break; case '/':push(stack, op1 /op2); break; } } } return pop(stack); } // Driver program to test above functions int main() { int result; char exp[] = "3+4/4*3-2*2"; infixToPostfix(exp); result=eval(exp); printf("결과값은 %d입니다.\n", result); return 0; } | cs |
결과
'과제 > 자료구조' 카테고리의 다른 글
#6. 학생 정보를 관리하는 이진 탐색트리 구현 (0) | 2020.05.26 |
---|---|
#5. 단순연결리스트를 이용한 정렬리스트 만들기 (0) | 2020.04.22 |
#3. 구조체,배열을 이용해 성적정렬하기 (6) | 2020.04.01 |
#2. 순환함수를 이용한 코드 완성 (0) | 2020.03.25 |
#1.수행시간을 측정해 결과값 제출 (0) | 2020.03.25 |