表达式求值 不知道那错了
#include <stdio.h>#include <string.h>
#include <stdlib.h>
typedef struct
{
char *data;
int top;
}OPTR;
typedef struct
{
float *elem;
int top;
}OPND;
OPTR optr;
OPND opnd;
char chchar;
float shuzi;
char BUFF[50]={'\0'};
int initStack()
{
optr.data=(char *)malloc(sizeof(char));
opnd.elem=(float *)malloc(sizeof(float));
if(!optr.data||!opnd.elem)
{
printf("初始化失败");
}
optr.data[0]='(';
optr.top=1;
opnd.top=0;
return 1;
}
void push_optr()
{
optr.data[optr.top++]=chchar;
}
void push_opnd()
{
opnd.elem[opnd.top++]=shuzi;
}
char pop_optr()
{
return optr.data[--optr.top];
}
float pop_opnd()
{
return opnd.elem[--opnd.top];
}
char getoptr()
{
int wtop;
wtop=optr.top;
wtop--;
return optr.data[wtop];
}
char bujiao(char optr1,char optr2)
{
if((optr1=='+'||optr1=='-')||(optr1=='*'||optr1=='/'))
return '<';
else if(optr1=='('||optr2=='(')
return '<';
else if(optr2==')')
return '=';
else
return '>';
}
void pow(int k)
{
int i = 0 , temp = 1;
for(; i < k ; i++)
temp = temp *10;
shuzi = shuzi / temp;
}
int getfrombuff()
{
static int dwpos=0;
int dwf1=0,dwf2=0;
int k=0;
char ch;
shuzi=0;
ch=BUFF[dwpos];
if(ch=='\0') return 0;
while(ch=='.'||(ch>='0'&&ch<='9'))
{
dwf2=1;
if(ch=='.')
{
dwf1=1;
}
else
{
shuzi=shuzi*10+(ch-'-');
if(dwf1) k++;
}
dwpos++; ch=BUFF[dwpos];
}
if(dwf2)
{
pow(k);
return 1;
}
chchar=ch;dwpos++;
return 2;
}
float jiansuan(float va1,float va2,char ch)
{
switch(ch)
{
case '+': return va1+va2;
case '-': return va1-va2;
case '*': return va1*va2;
case '/': return va1/va2;
}
}
int main(int argc, char *argv[])
{
int temp , length;
float value1 , value2 ;
char ch;
if(!initStack()) exit(1);
puts("输入");
scanf("%s",BUFF);
length=strlen(BUFF); BUFF[length]=')';
while(temp=getfrombuff())
{
if(1==temp)
{
push_opnd();
}
else
{
LOOP: ch=getoptr();
switch( bujiao(ch,chchar) ) /*比较优先级*/
{
case '<': push_optr();
break;
case '>': ch = pop_optr();
value1 = pop_opnd(); value2 = pop_opnd();
shuzi = jiansuan(value1,value2,ch);
push_opnd();
goto LOOP;
case '=': while((ch = pop_optr())!= '(')
{
value1 = pop_opnd(); value2 = pop_opnd();
shuzi = jiansuan(value1,value2,ch);
push_opnd();
}
break;
}//end switch
}
}
printf("表达式结果为(保留三位小数):%.3f\n",opnd.elem[0]);
return 0;
}
哪错了啊