求大佬帮忙,下面是用c写的求表达式的值,编译都通过了,但是不能得出表达式的值,屏幕会跳出输入的符号,并不是一个值,求大佬帮帮忙!
#include <stdio.h>
#include <stdlib.h>
# define INITSIZE 10
# define INCREA 10
#include <string.h>
#include <math.h>
char OP[7]={'+','-','*','/','(',')','#'}; //运算符数组(因多个函数使用故声明为公有的)
struct OPTRS
{
char *elem;
int base;
int top;
int size;
};
struct OPNDS
{
int *elem;
int base;
int top;
int size;
};
void initOPTRS(OPTRS &str)
{
str.elem=(char*)malloc(INITSIZE*sizeof(char));
if(!str.base) exit(-1);
str.top=str.base=0;
str.size=INITSIZE;
}
void initOPNDS(OPNDS &str)
{
str.elem=(int*)malloc(INITSIZE*sizeof(int));
if(!str.base) exit(-1);
str.top=str.base=0;
str.size=INITSIZE;
}
void pushOPTRS(OPTRS &str,char e)
{
if (str.top-str.base>=str.size)
{
str.elem=(char*)realloc(str.elem,(str.size+INITSIZE)*sizeof(char));
if (!str.elem) exit(-1);
str.size=str.size+INCREA;
}
str.elem[str.top]=e;
str.top++;
}
void pushOPNDS(OPNDS &str,int e)
{
if (str.top-str.base>=str.size)
{
str.elem=(int*)realloc(str.elem,(str.size+INITSIZE)*sizeof(int));
if (!str.elem) exit(-1);
str.size=str.size+INCREA;
}
str.elem[str.top]=e;
str.top++;
}
void popOPTRS(OPTRS &str,char &e)
{
if (str.top==str.base) exit(-1); //判断栈是否为空;
e=str.elem[str.top-1]; //注意注意
str.top--;
}
void popOPNDS(OPNDS &str,int &e)
{
if (str.top==str.base) exit(-1); //判断栈是否为空;
e=str.elem[str.top-1];
str.top--;
}
char outputOPTRS(OPTRS &str)
{
char e;
for(int i=str.top;i>0;i--)
{
popOPTRS(str,e);
printf("%c\n",e);
return (e);
}
}
int outputOPNDS(OPNDS &str)
{
int e;
for(int i=str.top;i>0;i--)
{
popOPNDS(str,e);
printf("%d\n",e);
return (e);
}
}
char precede(char c1,char c2){ //判定运算符的栈顶运算符与读入的运算符之间优先关系
char c;
switch(c1){
case '+':
case '-':
switch(c2){
case '+':
case '-':
case ')':
case '#':
c='>';
break;
default:
c='<';
}
break;
case '*':
case '/':
if(c2=='('){
c='<';
}
else{
c='>';
}
break;
case '(':
if(c2==')'){
c='=';
}
else{
c='<';
}
break;
case ')':
c='>';
break;
case '#':
if(c2=='#'){
c='=';
}
else{
c='<';
}
}
return c;
}
int In(char c,char *OP){ //判断是不是运算符
for(int i=0;i<7;i++)
if(c==OP[i]) //是运算符
return 1;
return 0;
}
int operate(int a,char theta,int b){ //进行二元运算 a theta b
int sum;
switch(theta)
{
case '+':
sum=a+b;
break;
case '-':
sum=a-b;
break;
case '*':
sum=a*b;
break;
case '/':
sum=a/b;
break;
}
return sum;
}
int main()
{
int a,b,sum,s=0;
char x,theta;
OPTRS optr;
OPNDS opnd;
initOPTRS(optr);
pushOPTRS(optr,'#');
initOPNDS(opnd);
char c=getchar();
while(c!='#' || (outputOPTRS(optr)!='#')){
if (!In(c,OP))
{pushOPNDS(opnd,c);c=getchar();} //不是运算符就进栈;
else
switch(precede(outputOPTRS(optr),c)){
case'<':
pushOPTRS(optr,c); c=getchar();break;
case'=':
popOPTRS(optr,x); c=getchar();break;
case'>':
popOPTRS(optr,theta);
popOPNDS(opnd,b);
popOPNDS(opnd,a);
s=operate(a,theta,b);
pushOPNDS(opnd,s);
break;
}
}
return outputOPNDS(opnd);
}