表达式求值

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
typedef struct{
    char*base;
char*top;
int stacksize;
}stack1;
typedef struct{
int*base;
int*top;
int stacksize;
}stack2;
int initstack1(stack1 &s);
int push1(stack1 &s,char c);
char gettop1(stack1 &s);
int pop1(stack1 &s);
int stackempty1(const stack1 &s);
int stackfull1(const stack1 &s);
int initstack2(stack2 &s);
int push2(stack2 &s,int e);
double gettop2(stack2 &s);
int pop2(stack2 &s);
int stackempty2(const stack2 &s);
int stackefull2(const stack2 &s);
int operate(int a,char y,int b);//计算
char precede(char op1,char op2);//处理运算符


int main()
{
char y,c;
int a,b,d;
stack1 OPTR;
stack2 OPND;
initstack1(OPTR);
push1(OPTR,'#');
initstack2(OPND);
printf("请输入表达式,当输入#时结束:\n");
c=getchar();
while(c!='#'||gettop1(OPTR)!='#')
{
if(c>='0'&&c<='9')//数字字符进行处理
{
d=c-48;
push2(OPND,d);
c=getchar();
}
else
{
switch(precede(gettop1(OPTR),c))
{
case '<':
push1(OPTR,c);
c=getchar();
break;
case '=':
c=pop1(OPTR);
c=getchar();
break;
case '>':
y=pop1(OPTR);
b=pop2(OPND);
a=pop2(OPND);
push2(OPND,operate(a,y,b));
break;
}
}
}
    printf("表达式结果为%lf:\n",gettop2(OPND));
return 0;
}


int initstack1(stack1 &s)              //定义数字栈
{
s.base=(char*)malloc(100*sizeof(char));
if(!s.base)
exit(0);
s.base=s.top;
s.stacksize=100;
return 1;
}


int push1(stack1 &s,char c)        //将#推入栈
{
if(stackfull1(s))
{
s.base=(char *)realloc(s.base,(s.stacksize+10)*sizeof(char));
if(!s.base) return 0;
s.top=s.base+s.stacksize;
s.stacksize+=10;
}
*s.top++=c;
return 1;
}
char gettop1(stack1 &s)   //返回栈顶元素
{
char c;
if(s.top==s.base)
return 0;
else

c=*(s.top-1);
return c;  
}
}


int pop1(stack1 &s)
{
char e;
if(s.top==s.base)
return 0;
e=*--s.top;
return e;
}


int stackempty1(const stack1 &s)
{
if(s.top==s.base)
return 1;
else
return 0;
}
int stackfull1(const stack1 &s)
{
if(s.top-s.base>=s.stacksize)
return 1;
else
return 0;
}






int initstack2(stack2 &s)              //定义运算符栈
{
s.base=(int*)malloc(100*sizeof(int));
if(!s.base)
exit(0);
s.base=s.top;
s.stacksize=100;
return 1;
}
int push2(stack2 &s,int e)
{
*s.top++=e;
return 1;
}


double gettop2(stack2 &s)

double e;
if(s.top==s.base)
return 0;
else

e=*(s.top-1);
return e;  
}
}


int pop2(stack2 &s)
{
int e;
if(s.top==s.base)
return 0;
e=*--s.top;
return e;
}


int stackempty2(const stack2 &s)
{
if(s.top==s.base)
return 1;
else
return 0;
}


int stackefull2(const stack2 &s)
{
if(s.top-s.base>=s.stacksize)
return 1;
else
return 0;
}








char precede(char op1,char op2)//处理运算符
{
char a[7][7]={'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=',' ','>','>','>','>',' ','>','>','<','<','<','<','<',' ','='};
    int i,j;
switch(op1)
{
case '+': i=0; break;
case '-': i=1; break;
case '*': i=2; break;
case '/': i=3; break;
case '(': i=4; break;
case ')': i=5; break;
case '#': i=6; break;
}
switch (op2)
{
case '+': j=0; break;
case '-': j=1; break;
case '*': j=2; break;
case '/': j=3; break;
case '(': j=4; break;
case ')': j=5; break;
case '#': j=6; break;
}
return a[i][j];
}
int operate(int a,char y,int b)//计算
{
int n;
    if(y=='+') n=a+b;
else if(y=='-') n=a-b;
else if(y=='*') n=a*b;
else n=a/b;
return n;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值