1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include "../Stack/stack.h" 5 6 int priority(char token); 7 bool isOperator(char token); 8 int calc(int operand1, int oper, int operand2); 9 10 int main() 11 { 12 char postfix[80] = {0}; 13 char temp[2] = {0}; 14 char token; 15 int* dataPtr; 16 STACK* stack; 17 int i = 0; 18 int operand1; 19 int operand2; 20 int value; 21 22 stack = createStack(); 23 24 printf("Enter an infix formula:"); 25 26 while((token = getchar()) != ‘\n‘){ 27 if(token == ‘(‘){ 28 dataPtr = (int*) malloc(sizeof(int)); 29 *dataPtr = token; 30 pushStack(stack, dataPtr); 31 } 32 else if(token == ‘)‘){ 33 dataPtr = (int*)popStack(stack); 34 while(*dataPtr != ‘(‘){ 35 temp[0] = *dataPtr; 36 strcat(postfix, temp); 37 free(dataPtr); 38 dataPtr = (int*)popStack(stack); 39 } 40 } 41 else if(isOperator(token)){ 42 dataPtr = (int*)stackTop(stack); 43 while(!emptyStack(stack) && priority(token) <= priority(*dataPtr)){ 44 dataPtr = (int*)popStack(stack); 45 temp[0] = *dataPtr; 46 strcat(postfix, temp); 47 free(dataPtr); 48 dataPtr = (int*)stackTop(stack); 49 } 50 dataPtr = (int*)malloc(sizeof(int)); 51 *dataPtr = token; 52 pushStack(stack, dataPtr); 53 } 54 else{ 55 temp[0] = token; 56 strcat(postfix, temp); 57 } 58 } 59 while(!emptyStack(stack)){ 60 dataPtr = (int*)popStack(stack); 61 temp[0] = *dataPtr; 62 strcat(postfix, temp); 63 } 64 65 printf("The postfix formula is: "); 66 puts(postfix); 67 68 while((token = postfix[i]) != ‘\0‘){ 69 if(!isOperator(token)){ 70 dataPtr = (int*)malloc(sizeof(int)); 71 *dataPtr = atoi(&token); 72 pushStack(stack, dataPtr); 73 } 74 else{ 75 dataPtr = (int*)popStack(stack); 76 operand2 = *dataPtr; 77 dataPtr = (int*)popStack(stack); 78 operand1 = *dataPtr; 79 value = calc(operand1, token, operand2); 80 dataPtr = (int*)malloc(sizeof(int)); 81 *dataPtr = value; 82 pushStack (stack, dataPtr); 83 } 84 i++; 85 } 86 87 dataPtr = (int*)popStack(stack); 88 value = *dataPtr; 89 printf("The result is %d\n", value); 90 91 destroyStack(stack); 92 93 return 0; 94 } 95 96 int priority(char token) 97 { 98 if(token == ‘*‘ || token == ‘/‘) 99 return 2; 100 if(token == ‘+‘ || token == ‘-‘) 101 return 1; 102 return 0; 103 } 104 105 bool isOperator(char token) 106 { 107 if(token == ‘*‘ || token == ‘/‘ || token == ‘+‘ || token == ‘-‘) 108 return true; 109 return false; 110 } 111 112 int calc(int operand1, int oper, int operand2) 113 { 114 int result; 115 116 switch(oper) 117 { 118 case ‘+‘: result = operand1 + operand2; 119 break; 120 case ‘-‘: result = operand1 - operand2; 121 break; 122 case ‘*‘: result = operand1 * operand2; 123 break; 124 case ‘/‘: result = operand1 / operand2; 125 break; 126 } 127 return result; 128 }
原文:https://www.cnblogs.com/zhangleshan/p/12377127.html