wo de c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
 

#define OK 1
#define ERROR 0

//数值类型的操作 
typedef struct LinkNodeOVS{
    int data;
    struct LinkNodeOVS *next;
}LinkStackNodeNum,*LinkStackNum;

LinkStackNum Init_Stack1 ()
{
	LinkStackNum top;
    top=(LinkStackNodeNum*)malloc(sizeof(LinkStackNodeNum));
	if(!top)
		top=NULL;
    return top;

}

int  Push1(LinkStackNum top,int e)
{
     LinkStackNum p;
     p=(LinkStackNodeNum*)malloc(sizeof(LinkStackNodeNum));///--
     p->data=e;
     p->next=top;
     top->next=p;
     return  OK;
          
}

int  Pop1(LinkStackNum top,int *e)
{
     LinkStackNum temp;
     if(!top)
     return ERROR;   
     *e=top->data;
     temp=top;
     top=top->next;
     free(temp);
     return OK;
}

int GetTop1(LinkStackNum top)
{
	if(top)
    return(top->data);    
}    
 

//字符型数据的操作
typedef struct LinkNodeOP{
    char data;
    struct LinkNodeOP *next;
}LinkStackNodeOP,*LinkStackOP;
 
LinkStackOP Init_Stack ( )
{
      LinkStackOP  top;
      top   =(LinkStackNodeOP*)malloc(sizeof(LinkStackNodeOP));// LinkStackOP 债分配了指针字节个大小空间
	  if(! top)
		  return ERROR;
	  top=NULL;
}
int  Push(LinkStackOP top,char e)
{
     LinkStackOP p;
     p=(LinkStackNodeOP*)malloc(sizeof(LinkStackNodeOP));
     p->data=e;
     p->next=top;
     top->next=p;
     return OK;
          
}

int  Pop(LinkStackOP top,char *e)
{
     LinkStackOP temp;
     if(!top)
     return ERROR;   
     *e=top->data;
     temp=top;
     top=top->next;
     free(temp);
     return OK; 
}

char GetTop(LinkStackOP top)
{
	if(top)
    return top->data;    
}    
 

//---------------------------------------------//

int  cmp[7][7]={{2,2,1,1,1,2,2},    /*用来进行比较运算符优先级的矩阵,3代表'=',2代表'>',1代表'<',0代表不可比*/
                {2,2,1,1,1,2,2},
                {2,2,2,2,1,2,2},
                {2,2,2,2,1,2,2},
                {1,1,1,1,1,3,0},
                {2,2,2,2,0,2,2},
                {1,1,1,1,1,0,3}};
char ops[7]={'+','-','*','/','(',')','#'}; 

int  Isoperator(char ch)      /*判断输入字符是否为运算符函数,是返回TRUE,不是返回FALSE*/
{
    char ops[7]={'+','-','*','/','(',')','#'};
	int i;
	for (i=0;i<7;i++)
	{
		if(ch==ops[i])
			return 1;
	}
	return 0;
}


char Compare(char ch1, char ch2)   /*比较运算符优先级函数*/
{
int  cmp[7][7]={{2,2,1,1,1,2,2},    /*用来进行比较运算符优先级的矩阵,3代表'=',2代表'>',1代表'<',0代表不可比*/
                {2,2,1,1,1,2,2},
                {2,2,2,2,1,2,2},
                {2,2,2,2,1,2,2},
                {1,1,1,1,1,3,0},
                {2,2,2,2,0,2,2},
                {1,1,1,1,1,0,3}};
char ops[7]={'+','-','*','/','(',')','#'}; 

	int i,m,n;
	char pri;
	int priority;
	for(i=0;i<7;i++)              /*找到相比较的两个运算符在比较矩阵里的相对位置*/
	{
		if(ch1==ops[i])	
			m=i;
		if (ch2==ops[i])
			n=i;
	}

	priority = cmp[m][n];
	switch(priority)
	{
	case 1:
		pri='<';
		break;
	case 2:
		pri='>';
		break;
	case 3:
		pri='=';
		break;
	case 0:
		pri='$';
		printf("表达式错误!\n");
		break;
	}
	return pri;
}

int Compute(int a,char op,int b)
{
     int result;
	switch(op)
	{
	case '+':
		result=a+b;
		break;
	case '-':
		result=a-b;
		break;
	case '*':
		result=a*b;
		break;
	case '/':
		result=a/b;
		break;
	}
    return result;
}
 //------------------------------------------------//      
int ExpEvaluation()
{
    char ch,op;
    int num,v,a,b,temp,i=0;
    char OPSET[7]={'+','-','*','/','(',')','#'};
    char *str;
    int  cmp[7][7]={{2,2,1,1,1,2,2},    /*用来进行比较运算符优先级的矩阵,3代表'=',2代表'>',1代表'<',0代表不可比*/
                {2,2,1,1,1,2,2},
                {2,2,2,2,1,2,2},
                {2,2,2,2,1,2,2},
                {1,1,1,1,1,3,0},
                {2,2,2,2,0,2,2},
                {1,1,1,1,1,0,3}};
    
     
    LinkStackOP  OPTR  ;
	 
 
    LinkStackNum OVS  ;
     
    OPTR=Init_Stack( );
    OVS =Init_Stack1( ); 
    Push(OPTR,'#');
 
    
    
    printf("\n请输入一个表达式已#结尾\n") ;
    str =(char *)malloc(50*sizeof(char));
    gets(str);
 
    ch=str[i];
	i++;
    
    
    while(ch!='#' || GetTop(OPTR)!='#')
    {
       if(!Isoperator(ch))
        {
          // num=GetNum(ch);
           //Push1(OVS,num); 
           temp=ch-'0';    /*将字符转换为十进制数*/
			ch=str[i];
			i++;
 			
			while(  !Isoperator(ch) )/*---在这就判断完是否下一个数是不是符号*/
			{
				temp=temp*10 + ch-'0'; /*将逐个读入运算数的各位转化为十进制数*/
				ch=str[i];
				i++;
			}
			Push1(OVS,temp);
		}
        
        
        else
        {
           switch ( Compare( GetTop(OPTR),ch))
           {
               case'<':  
				         Push(OPTR,ch);
                         ch=str[i];
			         	 i++;  break;
             
               
               case'>':  Pop(OPTR,&op);
                         Pop1(OVS,&b);
                         Pop1(OVS,&a);    
                         v=Compute(a,op,b);                       
                         Push1(OVS,v);
                         break;
                         
             case'=':    Pop(OPTR,&op);
                         ch=str[i];
				         i++;
                         break;
           } 
        }
    }
    
    v=GetTop1(OVS);
    return v;
      //system("PAUSE");
}

	


int main()                               /*主函数*/
{
	int result;
	result=ExpEvaluation();
	printf("\n表达式结果是%d\n",result);
	return 0;
}	

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值