zoukankan      html  css  js  c++  java
  • 四则运算表达式

    问题描述
    四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<string.h>
      4 #include<string>
      5 #include<sstream>
      6 #include<fstream>
      7 #include<iostream>
      8 #define TRUE 1
      9 #define FALSE 0
     10 #define MAXNUM 1000
     11 using namespace std;
     12 string str1;
     13 typedef int DataType;
     14 
     15 
     16 
     17 struct BinTreeNode;
     18 typedef struct BinTreeNode*PBinTreeNode;
     19 struct BinTreeNode
     20 {
     21     DataType data;
     22     PBinTreeNode left;
     23     PBinTreeNode right;
     24 };
     25 typedef struct BinTreeNode*BinTree;
     26 //typedef BinTree*PBinTree;
     27 
     28 int toTree(BinTree* btree,const char *exp,int len)
     29 {
     30 
     31     char c;
     32     int last,i,bracket;
     33     bool have_bracket=FALSE;
     34     int num,isnum,nint;
     35     int tag1,tag2;
     36 
     37 
     38     if(exp[0]=='('&&exp[len-1]==')')
     39         return toTree(btree,exp+1,len-2);
     40 
     41     bracket=0;
     42     last=len;
     43     for(i=len-1;i>=0;i--)
     44         {
     45             c=exp[i];
     46             if(c==')')
     47                 {
     48                     have_bracket=TRUE;
     49                     bracket++;
     50                 }
     51             if(c=='(') bracket--;
     52             if(bracket<0)
     53                 {
     54                     *btree=NULL;
     55                     return FALSE;
     56                 }
     57             if(bracket>0) continue;
     58             if(c=='+'||c=='-')
     59                 if(last==len||exp[last]=='*'||exp[last]=='/')
     60                     last=i;
     61             if(c=='*'||c=='/')
     62                 if(last==len)
     63                     last=i;
     64         }
     65       //  printf("last   %d
    ",last);
     66     if(bracket!=0) return FALSE;
     67 
     68     if(last==len)
     69         {
     70             if(have_bracket==TRUE)
     71                 {
     72                     *btree=NULL;
     73                     return FALSE;
     74                 }
     75             nint=0;
     76             isnum=FALSE;
     77             num=0;
     78             for(i=0;i<len;i++)
     79                 {
     80                     c=exp[i];
     81                     switch(c)
     82                         {
     83                             case'0':case'1':case'2':case'3':case'4':
     84                             case'5':case'6':case'7':case'8':case'9':
     85                                 if(isnum==FALSE)
     86                                     {
     87                                         num=c-'0';
     88                                         isnum=TRUE;
     89                                         nint++;
     90                                     }
     91                                 else
     92                                     {
     93                                         num=num*10+c-'0';
     94                                     }
     95                                 break;
     96                             case' ':case'	':case'
    ':
     97                                 isnum=FALSE;
     98                                 break;
     99                             default:
    100                                 *btree=NULL;
    101                                 return FALSE;
    102                         }
    103                 }
    104             if(nint!=1)
    105                 {
    106                     *btree=NULL;
    107                     return FALSE;
    108                 }
    109             *btree=(BinTree)malloc(sizeof(struct BinTreeNode));
    110             (*btree)->data=num;
    111             (*btree)->left=NULL;
    112             (*btree)->right=NULL;
    113             return TRUE;
    114         }
    115     *btree=(BinTree)malloc(sizeof(struct BinTreeNode));
    116     (*btree)->data=exp[last];
    117 
    118     tag1 =toTree(&(*btree)->left,exp,last);
    119     tag2 =toTree(&(*btree)->right,exp+last+1,len-last-1);
    120     if(tag1==TRUE&&tag2==TRUE)  return TRUE;
    121     return FALSE;
    122 }
    123 
    124 int cal(BinTree btree,int*result)
    125     {
    126 
    127         int result1,result2;
    128         if(btree==NULL)     return FALSE;
    129         if(btree->left==NULL&&btree->right==NULL)
    130             {
    131                 *result=btree->data;
    132                 return TRUE;
    133             }
    134         if(btree->left==NULL||btree->right==NULL)
    135             return FALSE;
    136 
    137         switch(btree->data)
    138             {
    139 
    140 
    141                 case'+':
    142                     //cout<<"+"<<endl;
    143                     if(cal(btree->left,&result1)==FALSE) return FALSE;
    144                     if(cal(btree->right,&result2)==FALSE) return FALSE;
    145                     *result=result1+result2;
    146                     return TRUE;
    147                 case'-':
    148                     //cout<<"-"<<endl;
    149                     if(cal(btree->left,&result1)==FALSE) return FALSE;
    150                     if(cal(btree->right,&result2)==FALSE) return FALSE;
    151                     *result=result1-result2;
    152                     return TRUE;
    153                 case'*':
    154                     //cout<<"*"<<endl;
    155                     if(cal(btree->left,&result1)==FALSE) return FALSE;
    156                     if(cal(btree->right,&result2)==FALSE) return FALSE;
    157                     *result=result1*result2;
    158                     return TRUE;
    159 
    160                 case'/':
    161                     //cout<<"/"<<endl;
    162                     if(cal(btree->left,&result1)==FALSE) return FALSE;
    163                     if(cal(btree->right,&result2)==FALSE) return FALSE;
    164                     *result=result1/result2;
    165                     return TRUE;
    166                 default:
    167                     return FALSE;
    168             }
    169     }
    170 
    171 void lastOrder(BinTreeNode *btree){
    172 
    173 
    174     if(btree){
    175 
    176         lastOrder(btree->left);
    177         lastOrder(btree->right);
    178         if((btree->data=='+')&&(btree->left!=NULL)&&(btree->right!=NULL))
    179            {cout<<'+';str1+='+';}
    180         else if((btree->data=='-')&&(btree->left!=NULL)&&(btree->right!=NULL))
    181             {cout<<'-';str1+='-';}
    182         else if((btree->data=='*')&&(btree->left!=NULL)&&(btree->right!=NULL))
    183             {cout<<'*';str1+='*';}
    184         else if((btree->data=='/')&&(btree->left!=NULL)&&(btree->right!=NULL))
    185             {cout<<'/';str1+='/';}
    186         else
    187             {cout<<btree->data<<" ";stringstream ch;ch<<btree->data;string tem;ch>>tem;str1+=tem;str1+=' ';}
    188 
    189     }
    190    // in.close();
    191 }
    192 
    193 int main()
    194 {
    195     char c,exp[MAXNUM];
    196     int result;
    197     BinTree btree;
    198    // printf("Please input the expression:");
    199     fstream in;
    200     in.open("exp");
    201     cout<<"从文件中读取中缀表达式"<<endl;
    202     string str;
    203     getline(in,str);
    204     strcpy(exp,str.c_str());
    205     if(toTree(&btree,exp,strlen(exp))==FALSE)
    206     {
    207         in<<"Wrong input!
    ";
    208 
    209 
    210 
    211 
    212     }
    213     else{
    214     lastOrder(btree);
    215     cout<<endl;
    216    // cout<<str1<<endl;
    217     in<<"---"<<str1<<endl;
    218     if(cal(btree,&result)==TRUE)  in<<result<<endl;
    219     else in<<"Wrong input!
    ";
    220 
    221 
    222     cout<<result<<endl;
    223     }
    224     in.close();
    225 
    226 }
    View Code
  • 相关阅读:
    关于java中面向对象特征的总结
    Jemter TCP压测坑:Hex-encoded binary string contains an uneven no. of digits,Hex-encoded binary string contains an uneven no. of digits
    distinct&group by去重的区别
    Idea从gitee上clone项目时候相关问题
    Nginx正向代理
    docker安装MySQL5.7
    Ubuntu server18.04.5环境配置
    Ubuntu18.04.5 server wifi的连接
    git commit 提交规范
    关于js的学习的推介
  • 原文地址:https://www.cnblogs.com/zhenzhenhuang/p/5461034.html
Copyright © 2011-2022 走看看