首页 > 其他 > 详细

中缀转后缀并计算

时间:2020-02-28 15:38:53      阅读:67      评论:0      收藏:0      [点我收藏+]
  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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!