fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 100
  4.  
  5. //해더파일 추가함!
  6.  
  7. typedef enum {lparen, rparen, plus, minus, times, devide, mod, eos, operand} precedence; //구조체 생성!
  8.  
  9. char expr[10] = {'6','2','/','3','-','4','2','*','+',':',}; //배열을 사용하여 계산하고자 하는 수식을 입력
  10. int stack[MAX]; //stack을 선언
  11. int stackTop = -1; //Top값을 초기화
  12. const int maxStackSize = MAX; //maxStackSize를 MAX값으로 지정
  13.  
  14. int pop (); // pop 함수 선언!
  15. void push(int value); // 변수 value로 돌리는 함수 push를 선언
  16. precedence getToken(char *symbol, int *n); //미리 선언한 구조체 함수 선언
  17.  
  18. int main(){ //main함수 시작
  19. int i, result; //변수 선언
  20.  
  21. for(i=0; i<maxStackSize; i++) //Stack의 사이즈 만큼 반복문을 돌림
  22. stack[i] = 0; //stack 초기화
  23.  
  24. printf("Expression : ");
  25. for (i=0; i<9; i++)
  26. printf("%c ", expr[i]);
  27. printf("\n");
  28. // expr[]
  29.  
  30. result = eval(); //eval()함수의 return값을 return함
  31. printf("Expression result is %d.\n", result);
  32. system("pause");
  33. return 0;
  34. }
  35.  
  36. int pop() { //stack에서 빼는 함수
  37. int topValue;
  38.  
  39. if(stackTop < 0) {
  40. printf("Stack is empty!\n");
  41. exit(0);
  42. }
  43. else{
  44. topValue = stack[stackTop];
  45. stackTop --;
  46. }
  47. return topValue;
  48. }
  49.  
  50. void push (int value) { //stack에 넣는 함수
  51. if(stackTop == maxStackSize -1) {
  52. printf("Stack is full!\n");
  53. exit(0);
  54. }
  55. else{
  56. stackTop++;
  57. stack[stackTop] = value;
  58. }
  59. }
  60.  
  61. precedence getToken (char *symbol, int *n) { // return값을 통해 stack에서 받아온 기호가 피연산자인지, 연산자인지, 어떤 연산자인지 알려주는 함수.
  62. *symbol = expr[(*n)++];
  63. switch (*symbol) {
  64. case '(' : return lparen;
  65. case ')' : return rparen;
  66. case '+' : return plus;
  67. case '-' : return minus;
  68. case '/' : return devide;
  69. case '*' : return times;
  70. case '%' : return mod;
  71. case ';' : return eos;
  72. default : return operand;
  73. }
  74. }
  75.  
  76. int eval (void) { //들어온 문자가 부호인지, 숫자인지 판별
  77. precedence token;
  78. char symbol;
  79. int op1, op2;
  80. int n = 0;
  81. token = getToken (&symbol, &n);
  82. while (token != eos) {
  83. if (token == operand)
  84. push (symbol-'0'); //어떤 문자로 된 기호에서 0을 빼서 숫자로 만들어주는 작업. 기호가 들어가는 경우, stack에서 숫자 2개를 빼서 각각 기호에 맞게 연산함.
  85. else {
  86. op2 = pop (); //처음 나온 값을 2번째라 이름 붙인다. 문자가 입,출력 되는 과정에서 순번이 뒤바뀌기 때문에 정정해주는 것이다.
  87. op1 = pop ();
  88. switch(token) { //연산자에 따라 알맞은 연산을 하도록 선언
  89. case plus: push(op1+op2); break;
  90. case minus: push(op1-op2); break;
  91. case times: push(op1*op2); break;
  92. case devide: push(op1/op2); break;
  93. case mod: push(op1%op2); break;
  94. }
  95. }
  96. token = getToken(&symbol, &n);
  97. }
  98. return pop();
  99. }
  100. precedence getToken(char *symbol, int *n) {
  101. *symbol = expr[(*n)++];
  102. switch (*symbol) {
  103. case '(' : return lparen;
  104. case ')' : return rparen;
  105. case '+' : return plus;
  106. case '-' : return minus;
  107. case '/' : return devide;
  108. case '*' : return times;
  109. case '%' : return mod;
  110. case ';' : return eos;
  111. default : return operand;
  112. }
  113. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.c: In function 'main':
prog.c:30:11: warning: implicit declaration of function 'eval' [-Wimplicit-function-declaration]
  result = eval(); //eval()함수의 return값을 return함
           ^
prog.c: In function 'eval':
prog.c:88:4: warning: enumeration value 'lparen' not handled in switch [-Wswitch]
    switch(token) { //연산자에 따라 알맞은 연산을 하도록 선언
    ^
prog.c:88:4: warning: enumeration value 'rparen' not handled in switch [-Wswitch]
prog.c:88:4: warning: enumeration value 'eos' not handled in switch [-Wswitch]
prog.c:88:4: warning: enumeration value 'operand' not handled in switch [-Wswitch]
prog.c: At top level:
prog.c:100:12: error: redefinition of 'getToken'
 precedence getToken(char *symbol, int *n) {
            ^
prog.c:61:12: note: previous definition of 'getToken' was here
 precedence getToken (char *symbol, int *n) { // return값을 통해 stack에서 받아온 기호가 피연산자인지, 연산자인지, 어떤 연산자인지 알려주는 함수.
            ^
stdout
Standard output is empty