hays

海纳百川
posts - 25, comments - 48, trackbacks - 0, articles - 0
  BlogJava :: 首页 ::  :: 联系 :: 聚合  :: 管理

表达式求值(C实现)

Posted on 2007-11-07 12:49 hays(海纳百川) 阅读(1632) 评论(2)  编辑  收藏
#include <stdio.h>
#include 
<stdlib.h>
#include 
<string.h>
#define MAXSIZE 
4000;
typedef struct 
{
    
char data[10];
    
int top;//头地址
    int base;//基地址
    int length;//长度
}
Stack;

void init(Stack *st)//初始化栈
{
    st
->base=0;
    st
->top=0;
    st
->length=0;
}


int isEmpty(Stack *st)
{
    
int n=0,top,base;
    top 
=st->top;
    base 
=st->base;
    
if(top==base)
    
{
        
return 1;
    }

    
return n;
}


int isFull(Stack *st)
{
    
int n=0,top,base;
    top 
=st->top;
    
if(top>=4000)
    
{
        
return 1;
    }

    
return n;
}


char  getTop(Stack *st)// 返回top值,不改变栈的结构
{
    
char n;
    
if(isEmpty(st))
    
{
        printf(
"栈为空\n");
        
return 0;
    }

    
int positon= st->top-1;
    n
= st->data[positon];//取出数据;
    return n;
}


char  pop(Stack *st)// 出栈,返回
{
    
char n;
    
if(isEmpty(st))
    
{
        printf(
"栈为空\n");
        
return 0;
    }

    
int positon= st->top-1;
    n
= st->data[positon];//取出数据;

    st
->top--;
    st
->length--;
    st
->data[positon]='\0';//消除数据
    return n;
}


void push(char n,Stack *st)//入栈
{
    
int positon ;
    
if(isFull(st))
    
{
        printf(
"栈满\n");
        
    }

    
else
    
{
        positon
= st->top;//获取位置

        st
->data[positon]=n;//存入数据

        st
->top++;//改变位置
    }


}


void show(Stack *m1)//输出栈中的数据
{
    
int top,base;
    top
=m1->top;
    base
=m1->base;
    
while(top>base)
    
{
        printf(
"%c,",m1->data[--top]);
    }

    printf(
"\n");
}


int isOperate(char temp)//是否是操作符
{
    
if(temp=='+'||temp=='-'||temp=='*'||temp=='/'||temp=='('||temp==')'||temp=='#')
    
{
        
return 1;
    }

    
return 0;
}


int isValue(char temp)//是否是数值
{
    
if(temp>='0'&&temp<='9')//
    {
        
return 1;
    }

    
else
    
{
        
return 0;
    }

}


int isAvail(char temp)//是否有效字符
{
    
if(isOperate(temp)||isValue(temp))//如果temp既不是操作符和数值的话,则它是非法的
    {
        
return 1;
    }

    
return 0;
}


int detect(char temp)//搜索矩阵位置
{
    
int i=0;
    
char oper[7]={'+','-','*','/','(',')','#'};
    
for(i=0;i<7;i++)
    
{
        
if(temp==oper[i])
        
{
            
return i;
        }

    }

}


char Priority(char temp,char optr)//判断优先级
{
    
/*
            +  -  *  /  (  )  #
            1  2  3  4  5  6  7
        + 1 <  <  <  <  >  >  >   
        - 2 <  <  <  <  >  >  >
        * 3 >  >  <  <  >  >  >
        / 4 >  >  <  <  >  >  > 
        ( 5 >  >  >  >  >  =  0  
        ) 6 <  <  <  <  =  0  > 
        # 7 <  <  <  <  >  0  =
    
*/

    
int row ,col;
    
char priority[7][7]={/*      +      -      *   /      (   )   #                */        
                             
{'<','<','<','<','>','>','>'},

                            
{'<','<','<','<','>','>','>'},

                            
{'>','>','<','<','>','>','>'},

                            
{'>','>','<','<','>','>','>'},

                            
{'>','>','>','>','>','=','>'},

                            
{'<','<','<','<','=','0','>'},

                            
{'<','<','<','<','>','<','='},                            
                        }
;


    row 
= detect(temp);//找出对应的矩阵下标;
    col = detect(optr);    
//    printf("%d,%d",row,col);
      
    
//优先级存储在一个7x7的矩阵中,对应关系上图;
    
    
return priority[row][col];

}

char evaluate(int a,int b,char oper)
{
    
switch(oper)
    
{
        
case '+'return a+b+'0';
        
case '-'return a-b+'0';
        
case '*'return a*b+'0';
        
case '/'return a/b+'0';
        
default : return 0+'0';
    }

}

int calculateExpress(char *express)//计算表达式
{
    
int result=0;
    Stack OPTR,OPND;
//OPTR存储操作符,OPND操作数值
    init(&OPTR);
    init(
&OPND);
    push(
'#',&OPTR);//默认第一个位'#'

    
////////////////////-算法-////////////////////////////
    while(*express!='\0')
    
{
        
char temp;
        temp
= *(express); 
        printf(
"---------------------------------\n");
        printf(
"当前的符号为%c\n",temp);
        
if(isAvail(temp))//是否是有效字符
        {    
                
if(isOperate(temp) )//输入的是操作符
                {
                    
char optr = getTop(&OPTR);//栈中top位的操作符
                    printf("栈顶操作符位:%c\n",optr);
                    
char prior = Priority(temp,optr);//判断优先级
                    switch(prior)
                    
{
                        
case '>':
                                    push(temp,
&OPTR);
                                    printf(
"将符号位%c入栈\n",temp);
                                    express
++;
                                    
break;
                        
case '<':
                                    
int a,b;

                                    
char oper,result;

                                    a
=pop(&OPND)-'0';//存在栈中的都是char字符
                                    b=pop(&OPND)-'0';
                                    oper
=pop(&OPTR);
                                    
                                    result
=evaluate(b,a,oper);//出栈一个操作符,计算结果
                                    
//printf("%d",result-'0');
                                    push(result,&OPND);//结果入OPND
                                    printf("%d%c%d结果为:%d\n",b,oper,a,result-'0');
                                    
break;
                    
                        
case '=':
                                    
//消除括号
                                    pop(&OPTR);
                                    printf(
"消除括号\n");
                                    express
++;
                                    
break;
                        
                    }


                }

                
if(isValue(temp))//输入的是数值
                {
                    push(temp,
&OPND);//将数值位入栈;
                    express++;
                    printf(
"将数值%c压入栈\n",temp);
                    
//show(&OPND);
                }

        }

        
else //表达式中有非法字符
        {
            printf(
"表达式中有非法字符\n");
            exit(
-1);//退出程序
        }

        
    
    }

//    show(&OPND);
//    show(&OPTR);
    return getTop(&OPND)-'0';
}


void inputExpress(char *express)//输入表达式
{
    
int length=0;
    printf(
"请输入一个表达式:");
    scanf(
"%s",express);
    
int len =strlen(express);
    express[len]
='#';//表达式最后一位默认为'#';
    express[len+1]='\0';

}


void output(char *express,int result)//输出表达式
{
    
int i=0;
    printf(
"----------------------------------------\n表达式:");
    
while(express[i]!='#')
    
{
        printf(
"%c",express[i]);
        i
++;
    }

    printf(
"=%d\n",result);



}


void main()
{
    
    
char express[100];//表达式 
    int result =0;
    
    inputExpress(express);
//输入表达式
    
    result 
= calculateExpress(express);//计算表达式;
    
    output(express,result);    
//输出表达式
    
    
//、、、、、、、、、、、、、测试优先级。
    /*
    char m='7' ;
    m=Priority('+','*');
    printf("优先级为%c",m);
    
    int m=evaluate(5,6,'m');
    printf("%d",m);
    
*/

}

评论

# re: 表达式求值(C实现)  回复  更多评论   

2009-10-10 22:00 by www
三百多行的代码居然只能做算术运算?43+34=7 。。。。。

# re: 表达式求值(C实现)  回复  更多评论   

2011-12-20 19:50 by yelangjunjie
十位数就不会算了,需要改进啊

只有注册用户登录后才能发表评论。


网站导航: