表达式求值,为什么我的函数输入1+1=后没有输出?输入样例
3*(9-7)=输出样例6。我的代码哪里写错了?题目要求要利用栈编写表达式求值程序:输入含有“+”、“-”、“*”、“/”四则运算的表达式,其中负数要用(0-正数)表示,并以=结束。
```c
#include<malloc.h>
#include<stdio.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
void Strcat(char *str1,char *str2);
typedef int SElemType;
typedef int Status;
struct SqStack
{
SElemType *base;
SElemType *top;
int stacksize;
};
Status InitStack(SqStack &S)
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
return ERROR;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
Status Pop1(SqStack &S,char &e)
{
e=*--S.top;
return OK;
}
Status GetTop(SqStack S)
{
if(S.top==S.base)
return ERROR;
//int e=*(S.top-1);
return OK;
}
Status GetTop1(SqStack S)
{
if(S.top==S.base)
return ERROR;
int e=*(S.top-1);
printf("%d\n",e);
return OK;
}
int StackLength(SqStack S)
{
int i;
i=S.top-S.base;
return i;
}
Status StackTraverse(SqStack S)
{
SElemType *p = (SElemType *)malloc(sizeof(SElemType));
p = S.top;
if(S.top==S.base)
printf("The Stack is Empty!");
else
{
printf("The Stack is: ");
p--;
while(p>=S.base)
{
printf("%d ", *p);
p--;
}
}
printf("\n");
return OK;
}
int In(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='='||c=='#'||c=='\n')
return 1;
else
return 0;
}
unsigned char prior[7][7] =
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'<','<','<','<','<',' ','>'},
{'<','<','<','<','<',' ','='}
};
char OPSET[9] = {'+','-','*','/','(',')','#','\n','='};
void Strcat(char *str1,char *str2)
{
int i = 0, j = 0;
while(str1[i]!='\0')
{
i++;
}
while(str2[j]!='\0')
{
str1[i++] = str2[j++];
}
str1[i] = '\0';
}
Status Precede(int a,char b)
{
int i = 0,j = 0;
while(OPSET[i] != a)
{
i++;
}
while(OPSET[j] != b)
{
j++;
}
return prior[i][j];
}
int Operate(int a,char theta,int c)
{
if (theta == '/' && c == 0)
{
printf("Error: Division by zero\n");
return 0;
}
switch(theta)
{
case '+':
return a+c;
case '-':
return a-c;
case '*':
return a*c;
case '/':
return a/c;
}
}
Status Atoi(char *c)
{
int data=0;
char *p=c;
while (*p!='=')
{
data = data * 10 + (*p - '0');
p++;
}
return data;
}
int main()
{
SqStack OPTR,OPND;
InitStack(OPTR);
InitStack(OPND);
char a[1000000],x,theta;
char *p=a;
gets(a);
int m,n,num=0;
Push(OPTR,'#');
char data[1000000];
data[0]='\0';
char tmp[2];
while(*p!='='||GetTop(OPTR)!='#') //也有可能是已经到等号,但栈里面还有其他的运算符
{
if(!In(*p))//是运算数
{
tmp[0]=*p;
tmp[1]='\0';
Strcat(data,tmp);
p++;
if(In(*p))//是运算符
{
num=Atoi(data);
Push(OPND,num);
data[0]='\0';
}
}
else
{
switch(Precede(GetTop(OPTR),*p))
{
case '<':
Push(OPTR,*p);
p++;
break;
case '>':
Pop1(OPTR,theta);
Pop(OPND,n);
Pop(OPND,m);
Push(OPND,Operate(m,theta,n));
break;
case '=':
Pop1(OPTR,x);
p++;
break;
}
}
}
while (GetTop(OPTR) != '#')
{
Pop1(OPTR, theta);
Pop(OPND, n);
Pop(OPND, m);
Push(OPND, Operate(m, theta, n));
}
GetTop1(OPND);
return 0;
}
