<div>감히 질문드립니다</div>C언어 자료구조 과제인데 <div>stack을 이용한 계산기 구현입니다. </div> <div>stack을 이용해 infix를 postfix로 바꾸어 계산하는 프로그램을 구현하면되는데</div> <div>+ - / * ^ % 등 대부분 연산자는 구현했으나 unary 연산이 계속 걸립니다 </div> <div>문자열에서 한글자를 케이스별로 연사자를 분류 하게되는데 단항연사자를 어떻게 구분해야할지 막막하네요 ㅠㅠ </div> <div><br></div> <div>3-(-3) 이나 3--3 과같은 수식들을 어떻게 구현해야할까요? </div> <div><br></div> <div>아래는 지금까지 작성한 프로그램입니다.</div> <div><br></div> <div>------------------</div> <div> <div>#include <stdio.h></div> <div>#include <stdlib.h></div> <div>#include <math.h></div> <div>#include <string.h></div> <div>#include <ctype.h></div> <div>#pragma warning (disable:4996)</div> <div><br></div> <div>char *cStack;</div> <div>int cSize;</div> <div>int cTop;</div> <div><br></div> <div>void cInitStack(int aSize)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>cSize = aSize;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>cStack = (char *)malloc(cSize*sizeof(char));</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>cTop = -1;</div> <div>}</div> <div><br></div> <div>void cFreeStack()</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>free(cStack);</div> <div>}</div> <div><br></div> <div>int cPush(char data)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (cTop < cSize - 1) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>cTop++;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>cStack[cTop] = data;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div>}</div> <div><br></div> <div>char cPop()</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (cTop >= 0) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return cStack[cTop--];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return -1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div>}</div> <div><br></div> <div>double *dStack;</div> <div>int dSize;</div> <div>int dTop;</div> <div><br></div> <div>void dInitStack(int aSize)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dSize = aSize;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dStack = (double *)malloc(dSize*sizeof(double));</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dTop = -1;</div> <div>}</div> <div><br></div> <div>void dFreeStack()</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>free(dStack);</div> <div>}</div> <div><br></div> <div>int dPush(double data)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (dTop < dSize - 1) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dTop++;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dStack[dTop] = data;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div>}</div> <div><br></div> <div>double dPop()</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (dTop >= 0) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return dStack[dTop--];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return -1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div>}</div> <div><br></div> <div>int GetPriority(int op)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>switch (op) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '(':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '+':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '-':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '*':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '/':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '%':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 2;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '^':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 3;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 100;</div> <div>}</div> <div><br></div> <div>void MakePostfix(char *postfixExp, const char *infixExp) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>const char *m = infixExp;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>char *p = postfixExp, c;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>cInitStack(256);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>while (*m) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>// 숫자 - 그대로 출력하고 뒤에 공백 하나를 출력한다.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (isdigit(*m)) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>while (isdigit(*m) || *m == '.') *p++ = *m++;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>*p++ = ' ';</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>// 연산자 - 스택에 있는 자기보다 높은 연산자를 모두 꺼내 출력하고 자신은 푸시한다.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else if (strchr("^*/%+-", *m)) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>while (cTop != -1 && GetPriority(cStack[cTop]) >= GetPriority(*m)) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>*p++ = cPop();</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>cPush(*m++);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>// 여는 괄호 - 푸시한다.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (*m == '(') {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>cPush(*m++);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>// 닫는 괄호 - 여는 괄호가 나올 때까지 팝해서 출력하고 여는 괄호는 버린다.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else if (*m == ')') {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (;;) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>c = cPop();</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (c == '(') break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>*p++ = c;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>m++;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>m++;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>// 스택에 남은 연산자들 모두 꺼낸다.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>while (cTop != -1) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>*p++ = cPop();</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>*p = 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>cFreeStack();</div> <div>}</div> <div><br></div> <div>double CalcPostfix(const char *postfixExp)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>const char *p = postfixExp;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>double num;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>double left, right;</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dInitStack(256);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>while (*p) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>// 숫자는 스택에 넣는다.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (isdigit(*p)) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>num = atof(p);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dPush(num);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (; isdigit(*p) || *p == '.'; p++) { ; }</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>// 연산자는 스택에서 두 수를 꺼내 연산하고 다시 푸시한다.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (strchr("^*/%+-", *p)) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>right = dPop();</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>left = dPop();</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>switch (*p) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '+':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dPush(left + right);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '-':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dPush(left - right);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '*':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dPush(left*right);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '/':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (right == 0.0) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dPush(0.0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dPush(left / right);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '%':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (right == 0) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dPush(0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dPush((int)left % (int)right);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case '^':</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dPush(pow(left, right));</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>// 연산 후 또는 연산자가 아닌 경우 다음 문자로</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>p++;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (dTop != -1) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>num = dPop();</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>num = 0.0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>dFreeStack();</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return num;</div> <div>}</div> <div><br></div> <div>int CheckExp(const char *infixExp) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>const char *p;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int count;</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (p = infixExp, count = 0; *p; p++) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (*p == '(') count++;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (*p == ')') count--;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return count;</div> <div>}</div> <div><br></div> <div>int main(void) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>char infixExp[256];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>char postfixExp[256];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int Error;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>double result;</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("\n");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("\n");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("*************************\n");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf(" STACK 계 산 기\n");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("*************************\n");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("\n");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("\n");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>system("pause");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>system("cls");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>while (1) {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("수식 입력(끝내려면, exit 를 입력)\n ->");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>gets(infixExp);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (strcmp(infixExp, "exit") == 0) break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>Error = CheckExp(infixExp);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (Error != 0) </div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("수식이 잘못되었습니다.\n");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else {</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("Infix: %s\n", infixExp);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>MakePostfix(postfixExp, infixExp);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>result = CalcPostfix(postfixExp);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("Postfix: %s\n", postfixExp);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("Result: %.2f\n", result);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div>}</div></div> <div>-------------------------------------</div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.