zoukankan      html  css  js  c++  java
  • C实现将中缀算术式转换成后缀表达式

      1 #include "stdio.h"
      2 #include "stdlib.h"
      3 #include "ctype.h"
      4 #include "math.h"
      5 #include "string.h"
      6 
      7 struct stackNode{
      8     char data;
      9     int value;
     10     struct stackNode *nextPtr;
     11 };
     12 
     13 typedef struct stackNode StackNode;
     14 typedef StackNode *StackNodePtr;
     15 
     16 int isOperator(char c);
     17 void convertToPostfix(char infix[],char postfix[]);
     18 int precedence(char opt1,char opt2);
     19 void push(StackNodePtr *topPtr, char value);
     20 char pop(StackNodePtr *topPtr);
     21 void push2(StackNodePtr *topPtr, int value);
     22 int pop2(StackNodePtr *topPtr);
     23 char stackTop(StackNodePtr topPtr);
     24 int isEmpty(StackNodePtr topPtr);
     25 void printStack(StackNodePtr topPtr);
     26 int calculate(int val1, int val2, char opt);
     27 int evaluatePostfixExp(char postfix[]);
     28 
     29 int main(void)
     30 {
     31     int i=0;
     32     char ch;
     33     char infix[100];
     34     char postfix[100];
     35 
     36     printf("Enter the expression:
    ");
     37 
     38     while((ch = getchar()) != '
    '){
     39         if(ch != ' '){
     40             if(isdigit(ch)){
     41                 infix[i++] = ch; 
     42             }
     43             else if(isOperator(ch)){
     44                 infix[i++] = ' ';
     45                 infix[i++] = ch; 
     46                 infix[i++] = ' ';
     47             }else if(ch == '('){
     48                     infix[i++] = ch; 
     49                     infix[i++] = ' ';
     50             }else{
     51                 infix[i++] = ' ';
     52                 infix[i++] = ch; 
     53             }
     54         }
     55     }
     56     infix[i] = ''; 
     57     
     58     printf("the infix:
    %s
    ",infix);
     59     convertToPostfix(infix,postfix);
     60     printf("the postfix:
    %s
    ",postfix);
     61 
     62     printf("result:%d
    ",evaluatePostfixExp(postfix));
     63     getchar();
     64     return 0;
     65 }
     66 
     67 /*是否为操作符*/
     68 int isOperator(char c)
     69 {
     70     switch(c){
     71         case '+':
     72         case '-':
     73         case '*':
     74         case '/':
     75         case '^':
     76             return 1;break;
     77         default:
     78             return 0;break;
     79     }
     80 }
     81 
     82 /*转换成后缀表达式*/
     83 void convertToPostfix(char infix[],char postfix[])
     84 {
     85     int i,j=0;
     86     char *strPtr;
     87     char popValue;
     88     StackNodePtr stackPtr =NULL;
     89 
     90     strPtr = strtok(infix, " ");
     91     while(strPtr){
     92         if(isdigit(strPtr[0])){
     93             if(j>0 ){
     94                 postfix[j++] = ' ';
     95             }
     96             while(*strPtr !=  ''){
     97                 postfix[j++] = *strPtr;
     98                 strPtr++;
     99             }
    100         }else if(strPtr[0] == '('){
    101             push(&stackPtr,'(');
    102             printStack(stackPtr);
    103         }else if(strPtr[0] == ')'){//遇到右括号,必须把对应左括号前的运算符都弹出
    104             while((popValue = pop(&stackPtr)) != '(' ){
    105                 postfix[j++] = ' ';
    106                 postfix[j++] = popValue;
    107                 printStack(stackPtr);
    108             }
    109         }else if(isOperator(strPtr[0])){
    110             int flag = 1;
    111             char tmpCH;
    112             while(flag){//这里必须判断栈里是否还有运算符优先级比当前运算符高的
    113                 tmpCH = stackTop(stackPtr);
    114                 if(tmpCH == '(' || tmpCH == '0'){
    115                     push(&stackPtr,strPtr[0]);
    116                     printStack(stackPtr);
    117                     flag = 0;
    118                 }else{
    119                     if(precedence(strPtr[0],tmpCH) > 0){
    120                         postfix[j++] = ' ';
    121                         postfix[j++] = pop(&stackPtr);
    122                         printStack(stackPtr);
    123                     }else{
    124                         push(&stackPtr,strPtr[0]);
    125                         printStack(stackPtr);
    126                         flag = 0;
    127                     }
    128                 }
    129             }
    130         }
    131         strPtr = strtok(NULL, " ");
    132     }
    133     while(!isEmpty(stackPtr)){//栈里如果还有运算符就弹出
    134         postfix[j++] = ' ';
    135         postfix[j++] = pop(&stackPtr);
    136         printStack(stackPtr);
    137     }
    138 /*    for(i = 0; infix[i] != ''; i++){
    139         if(isOperator(infix[i])){
    140             char tmpCH = stackTop(stackPtr);
    141             if(tmpCH == '(' || tmpCH == '0'){
    142                 push(&stackPtr,infix[i]);
    143                 printStack(stackPtr);
    144             }else{
    145                 if(precedence(infix[i],tmpCH) > 0){
    146                     postfix[j++] = pop(&stackPtr);
    147                     push(&stackPtr,infix[i]);
    148                     printStack(stackPtr);
    149                 }else{
    150                     push(&stackPtr,infix[i]);
    151                     printStack(stackPtr);
    152                 }
    153             }
    154         }else if(infix[i] == '('){
    155             push(&stackPtr,infix[i]);
    156             printStack(stackPtr);
    157         }else if(infix[i] == ')'){
    158             while((popValue = pop(&stackPtr)) != '(' ){
    159                 postfix[j++] = popValue;
    160                 printStack(stackPtr);
    161             }
    162         }else if(isdigit(infix[i])){
    163             postfix[j++] = infix[i];
    164         }
    165     }
    166     while(!isEmpty(stackPtr)){
    167         postfix[j++] = pop(&stackPtr);
    168         printStack(stackPtr);
    169     }
    170     */
    171     postfix[j] = '';
    172 }
    173 
    174 /*优先级的判断*/
    175 int precedence(char opt1,char opt2)
    176 {
    177     switch(opt1){
    178         case '+':
    179         case '-':if(opt2 == '+' || opt2 == '-'){
    180                     return 0;
    181                  }else{
    182                     return 1;
    183                  }
    184                  break;
    185         case '*':
    186         case '/':
    187         case '^':
    188         case '%':if(opt2 == '+' || opt2 == '-'){
    189                     return -1;
    190                  }else{
    191                     return 0;
    192                  }
    193                  break;
    194         default:
    195             printf("unvalid operator.
    ");
    196             break;
    197     }
    198 }
    199 
    200 void push(StackNodePtr *topPtr, char value)
    201 {
    202     StackNodePtr newPtr;
    203     newPtr = (StackNodePtr)malloc(sizeof(StackNode));
    204     if(newPtr != NULL){
    205         newPtr->data = value;
    206         newPtr->nextPtr = *topPtr;
    207         *topPtr = newPtr;    
    208     }else{
    209         printf("call for memeory is failed!
    ");
    210     }
    211 }
    212 
    213 void push2(StackNodePtr *topPtr, int value)
    214 {
    215     StackNodePtr newPtr;
    216     newPtr = (StackNodePtr)malloc(sizeof(StackNode));
    217     if(newPtr != NULL){
    218         newPtr->value = value;
    219         newPtr->nextPtr = *topPtr;
    220         *topPtr = newPtr;    
    221     }else{
    222         printf("call for memeory is failed!
    ");
    223     }
    224 }
    225 
    226 char pop(StackNodePtr *topPtr)
    227 {
    228     char value;
    229     StackNodePtr tmpPtr;
    230     tmpPtr = *topPtr;
    231     value = (*topPtr)->data;
    232     *topPtr = (*topPtr)->nextPtr ; 
    233     free(tmpPtr);
    234     return value;
    235 }
    236 
    237 int pop2(StackNodePtr *topPtr)
    238 {
    239     int value;
    240     StackNodePtr tmpPtr;
    241     tmpPtr = *topPtr;
    242     value = (*topPtr)->value;
    243     *topPtr = (*topPtr)->nextPtr ; 
    244     free(tmpPtr);
    245     return value;
    246 }
    247 
    248 char stackTop(StackNodePtr topPtr)
    249 {
    250     if(!isEmpty(topPtr)){
    251         return topPtr->data;
    252     }else{
    253         return '0';
    254     }
    255 }
    256 
    257 int isEmpty(StackNodePtr topPtr)
    258 {
    259     return topPtr==NULL;
    260 }
    261 
    262 void printStack(StackNodePtr topPtr)
    263 {
    264     if(topPtr){
    265         while(topPtr){
    266             printf("%c",topPtr->data);
    267             topPtr = topPtr ->nextPtr;
    268         }
    269         printf("NULL
    ");
    270     }else{
    271         printf("this stack is empty.
    ");
    272     }
    273 }
    274 
    275 int evaluatePostfixExp(char postfix[])
    276 {
    277     int i;
    278     int val1,val2;
    279     char *tokenPtr;
    280     StackNodePtr stackPtr = NULL;
    281 
    282     tokenPtr = strtok(postfix, " ");
    283 
    284     while(tokenPtr){
    285         if(isdigit(tokenPtr[0])){
    286             push2(&stackPtr,atoi(tokenPtr));
    287         }
    288         if(isOperator(tokenPtr[0])){
    289             val1 = pop2(&stackPtr) ;
    290             val2 = pop2(&stackPtr) ;
    291             push2(&stackPtr,calculate(val2,val1,tokenPtr[0]));
    292         }
    293         tokenPtr = strtok(NULL, " ");
    294     }
    295 /*    for(i=0; postfix[i] != ''; i++){
    296         if(isdigit(postfix[i])){
    297             push(&stackPtr,postfix[i]);
    298         }
    299         if(isOperator(postfix[i])){
    300             val1 = pop(&stackPtr) - 48;
    301             val2 = pop(&stackPtr) - 48;
    302             push(&stackPtr,calculate(val2,val1,postfix[i]) +48);
    303         }
    304     }*/
    305 
    306     return pop2(&stackPtr);
    307 }
    308 
    309 int calculate(int val1, int val2, char opt)
    310 {
    311     switch(opt){
    312         case '+':
    313             return val1 + val2;
    314             break;
    315         case '-':
    316             return val1 - val2;
    317             break;
    318         case '*':
    319             return val1*val2;
    320             break;
    321         case '/':
    322             return val1/val2;
    323             break;
    324         case '^':
    325             return (int)(pow((double)val1,val2));
    326             break;
    327         default:
    328             printf("operator is error!
    ");
    329     }
    330     return 0;
    331 }
  • 相关阅读:
    reindex-maven 私服(nexus)架设以及项目管理中遇到的问题及解决方案(updating)
    Maven 向私服nexus上传jar
    让 linux centos 文件夹地址栏 位置栏显示出来的方法
    JS版的Server.UrlEncode
    兼容火狐,ie8的 js urlencode和urldecode
    ORA-00257: archiver error. Connect internal only, until freed.
    【转载】spring mvc 使用session
    【转载】@RequestMapping的分类
    【转载】加密Spring加载的Properties文件
    [转载]meclipse中project facet问题
  • 原文地址:https://www.cnblogs.com/ShowJoy/p/3593159.html
Copyright © 2011-2022 走看看