四则运算 (数据结构)

 

顺便把一个四则运算的代码贴出来了,上学期大一写的,核心算法跟我写的重言式我中的virtualCreateTree函数类似,这就不啰嗦一遍了, 代码如下: (可能有bug)

/********************************************************************
created: 2007/06/09
author:  刺猬

  purpose: 四则运算
********************************************************************
*/


#include 
" stdio.h "
#include 
" stdlib.h "
#include 
" math.h "

typedef 
struct  node  {
    
char data;
    
struct node *left;
    
struct node *right;
}
binarytree;

typedef 
struct  exp {
    
char data;
    
int  weight;
}
express;

int  analyse( char  before[],express expression[])
{
    
char *p=&before[0];
    express 
*loc=&expression[0];
    
int weight=0;
    
int len=0;
    
while(*p!= ‘/0’)
    
{
        
switch(*p) 
        
{
        
case '(':
            weight
=weight+4;
            
break;
        
case ')':
            weight
=weight-4;
            
break;
        
case '+':
        
case '-':
            loc
->data=*p;
            loc
->weight=weight+1;
            loc
++;
            len
++;
            
break;
        
case '*':
        
case '/':
            loc
->data=*p;
            loc
->weight=weight+2;
            loc
++;
            len
++;
            
break;
        
case '^':
            loc
->data=*p;
            loc
->weight=weight+3;
            loc
++;
            len
++;
            
break;
        
default:
            loc
->data=*p;
            loc
->weight=0;
            loc
++;
            len
++;
        }

        p
++;
    }

    
return len;
}


int  find_lowest(express expression[], int   & start, int   & end)
{  
    
int lowest=start+1;    
    
for(int i=start;i<=end;i++)
        
if(expression[i].weight>0&&expression[i].weight<expression[lowest].weight)
            lowest
=i;
        
        
return lowest;
}


binarytree 
* create_tree(express expression[], int  start, int  end)
{
    binarytree 
*root=(binarytree *)malloc(sizeof(binarytree)); 
    
if(start==end)
    
{
        root
->data=expression[start].data;
        root
->left=NULL;
        root
->right=NULL;
    }
 
    
else
    
{
        
int key=find_lowest(expression,start,end);
        root
->data=expression[key].data;
        root
->left=create_tree(expression,start,key-1);
        root
->right=create_tree(expression,key+1,end);
    }

    
return root;
}



double  calculator(binarytree  * root)
{
    
if(root)
    
{
        
if(root->left==NULL&&root->right==NULL)
            
return atof(&root->data);
        
else 
        
{
            
switch(root->data)
            
{
            
case '*':
                
return calculator(root->left)*calculator(root->right);
                
break;
            
case '/':
                
return calculator(root->left)/calculator(root->right);
                
break;
            
case '+':
                
return calculator(root->left)+calculator(root->right);
                
break;
            
case '-':
                
return calculator(root->left)-calculator(root->right);
                
break;
            
case '^':
                
return pow(calculator(root->left),calculator(root->right));
            
default:
                
break;
            }

        }

    }

}


int  main()
{
    
int    start=0;
    
int    len;
    
char   original_expression[256];
    express   expression[
256];
    
    
    
while(scanf("%s",original_expression))
    
{
        len
=analyse(original_expression,expression);
        binarytree 
*root=create_tree(expression,start,len-1);
        
//inorder(root);
        printf("%lf ",calculator(root));
    }

    
return 0;
}


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值