#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;
}
wo de c
最新推荐文章于 2023-06-22 22:01:13 发布