1. #include<stdio.h> 
  2. #include<string.h> 
  3. #include<ctype.h> 
  4. #define MAXSIZE 40 
  5.  
  6. /*******************************************************************************/  
  7. typedef char ElemType;  
  8. typedef struct Stack{//定义栈结构  
  9.     ElemType data[MAXSIZE]; 
  10.     int top; 
  11. }Stack,*pStack; 
  12. void initStack(pStack pS){//初始化栈  
  13.     pS->top = -1; 
  14. bool push(pStack pS,ElemType e){//入栈  
  15.     if(pS->top == MAXSIZE - 1){ 
  16.         puts("栈满,无法入栈"); 
  17.         return false
  18.     } 
  19.     pS->data[++(pS->top)] = e; 
  20.     return true
  21. bool pop(pStack pS,ElemType *e){//出栈  
  22.     if(pS->top == -1){ 
  23.         puts("栈空,无法出栈"); 
  24.         return false
  25.     } 
  26.     *e = pS->data[(pS->top)--]; 
  27.     return true
  28. bool getTop(pStack pS,ElemType *e){//获得栈顶元素  
  29.     if(pS->top == -1){ 
  30.         puts("栈空,无法取得栈顶元素"); 
  31.         return false
  32.     } 
  33.     *e = pS->data[pS->top]; 
  34.     return true
  35. void printStack(pStack pS){//打印栈  
  36.     int index = pS->top; 
  37.     while(index != -1){ 
  38.         printf("%c",pS->data[index--]); 
  39.     } 
  40.     puts(""); 
  41. /*******************************************************************************/  
  42. void handleOperator(pStack pS,char chInput,char *systemOutput,int *indexOutput); 
  43. int getPrior(char ch); 
  44. void converToLastInfix(char *userInput,char *systemOutput); 
  45. /*******************************************************************************/ 
  46. int main(void){ 
  47.     char userInput[MAXSIZE];//存储用户输入 
  48.     char systemOutput[MAXSIZE];//存储后缀表达式 
  49.     int index; 
  50.      
  51.     puts("Enter a string:"); 
  52.     gets(userInput); 
  53.     converToLastInfix(userInput,systemOutput);//中缀转换为后缀  
  54.     for(index=0;index<strlen(systemOutput);index++){ 
  55.         printf("%c",systemOutput[index]); 
  56.     } 
  57.     getchar(); 
  58.     return 0; 
  59. /*******************************************************************************/ 
  60. void converToLastInfix(char *userInput,char *systemOutput){//中缀转换为后缀  
  61.     Stack S1;//符号栈  
  62.     pStack pS1 = &S1; 
  63.     initStack(pS1); 
  64.      
  65.     char ch;//存储用户输入一个字符  
  66.     int index;//遍历用户输入用  
  67.     int indexOutput = 0;//用于存储系统输出  
  68.     bool tag;//标志位,用于  
  69.      
  70.    
  71.     for(index=0;index<strlen(userInput);index++){ 
  72.         ch = userInput[index]; 
  73.         if(isdigit(ch)){ 
  74.             tag = true
  75.             systemOutput[indexOutput++] = ch; 
  76.             continue
  77.         } 
  78.         else
  79.             if(tag){ 
  80.                 systemOutput[indexOutput++] = '#'
  81.                 tag = false
  82.             } 
  83.             if(strchr("+-*/()",ch)){ 
  84.                 handleOperator(pS1,ch,systemOutput,&indexOutput); 
  85.             } 
  86.             else
  87.                 continue
  88.             } 
  89.         } 
  90.           
  91.     } 
  92.     while(pS1->top != -1){ 
  93.         if(tag){ 
  94.             systemOutput[indexOutput++] = '#'
  95.             tag = false
  96.         } 
  97.         char chPop; 
  98.         pop(pS1,&chPop); 
  99.         systemOutput[indexOutput++] = chPop; 
  100.         systemOutput[indexOutput++] = '#'
  101.     } 
  102.     systemOutput[indexOutput++] = '\0'
  103. /*******************************************************************************/ 
  104. void handleOperator(pStack pS,char chInput,char *systemOutput,int *indexOutput){//处理运算符  
  105.     ElemType chTop;//存储栈顶元素 
  106.     ElemType chPop;//存储出栈元素 
  107.     int priorInput;//输入元素的优先级  
  108.     int priorTop;//栈顶元素的优先级  
  109.      
  110.     if(pS->top == -1){//栈空的情况直接入栈并退出函数  
  111.         push(pS,chInput); 
  112.         return
  113.     } 
  114.     if(chInput == '('){//如果是左括号直接入栈并退出函数  
  115.         push(pS,chInput); 
  116.         return
  117.     } 
  118.     if(chInput == ')'){//如果是右括号则一直出栈输出知道碰到'('  
  119.         while(pop(pS,&chPop)){//取出栈顶元素  
  120.             if(chPop == '('){ 
  121.                 break;//退出  
  122.             } 
  123.             else
  124.                 systemOutput[(*indexOutput)++] = chPop; //输出  
  125.                 systemOutput[(*indexOutput)++] = '#'
  126.                 continue;//继续  
  127.             } 
  128.         } 
  129.         return ; 
  130.     } 
  131.     while(true){ 
  132.         getTop(pS,&chTop);//取得栈顶元素 
  133.         priorInput = getPrior(chInput);//取得输入元素的优先级  
  134.         priorTop = getPrior(chTop);//取得栈顶元素的优先级  
  135.         if(priorInput>priorTop){//如果输入元素的优先级高于栈顶元素  
  136.             push(pS,chInput);//入栈  
  137.             break;//退出循环  
  138.         } 
  139.         else
  140.             pop(pS,&chPop); 
  141.             systemOutput[(*indexOutput)++] = chPop; 
  142.             systemOutput[(*indexOutput)++] = '#'
  143.             if(pS->top == -1){//栈空的情况直接入栈并退出循环  
  144.                 push(pS,chInput); 
  145.                 break
  146.             } 
  147.         } 
  148.     } 
  149. /*******************************************************************************/ 
  150. int getPrior(char ch){//获得优先级  
  151.     switch(ch){ 
  152.         case '+'
  153.         case '-'
  154.              return 1; 
  155.         case '*'
  156.         case '/'
  157.              return 2; 
  158.         case '('
  159.              return 0; 
  160.     } 
  161. /*******************************************************************************/