后缀记法的实现
例:6523+8*+3+* = ( (2+3)*8+5+3)*6 =288
没什么技术成分,新手练手。
#include <stdio.h>
#include <malloc.h>
typedef struct Post
{
int data;
struct Post *Next;
struct Post *pBottom;
}*List;
void init(List p)
{
if(p==NULL)
{
printf("分配内存失败\n");
}
else
{
p->pBottom=p;
}
}
List push(List p,int data)
{
List q=p;
p=(List)malloc(sizeof(Post));
p->Next=q;
p->data=data;
return p;
}
List pop(List p,char c)//主要问题是释放内存的地方总是出错
{
switch(c)
{
case '+': (p->Next->data)=(p->data)+(p->Next->data);break;
case '-': (p->Next->data)=(p->data)-(p->Next->data);break;
case '*': (p->Next->data)=(p->data)*(p->Next->data);break;
case '/': (p->Next->data)=(p->data)/(p->Next->data);break;
}
List r=p;
p=p->Next;
free(r);
r=NULL;
return p; //bug找到了。原因是List p没有返回出去,导致这个函数的p是局部变量。
}
int main()
{
char c;
int data;
List p;
p=(List)malloc(sizeof(Post));
init(p);
while ((c=getchar())!='\n')
{
if (c=='+' || c=='-' || c=='*' || c=='/')
{
p=pop(p,c);
}
else
{
data=c-'0';
p=push(p,data);
}
}
printf("%d\n",p->data);//测试数据 6523+8*+3+* 输出 288
return 0;
}