数据结构4——链栈——表达式求值
今天我们用链栈解决表达式求值的问题,首先表达式分为前缀,中缀,后缀表达式,日常生活里我们写的都是中缀表达式,这里我们变后缀的代码不再给出,输入一个后缀的表达式,求表达式的值。代码可以实现,负数、多位数,小括号,小数点暂不可实现,全是int量,但需要自行输入后缀表达式输入。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int elmtype;
typedef struct LinkedStackNode{
elmtype data1;
elmtype data3;
char data2;
struct LinkedStackNode *next;
}LinkedStackNode,*LinkedStack;
LinkedStack top;
LinkedStack init();
int push(LinkedStack top,elmtype x);
int pop(LinkedStack top,elmtype *x);
int main()
{
char p[100];
int i=0,x1,x2,k,m=0,n=0,j=0;
LinkedStack head,tail,s,q,r;
printf("请输入需要计算的表达式\n");
s=init();
head=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
tail=head;
head->next=NULL;
gets(p);
k=strlen(p);
while(i<k-1)
{
if(p[i]==' ')
{
if(p[i-1]>='0'&&p[i-1]<='9')
{
q=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
if(p[j]=='-'&&p[j+1]>='0'&&p[j+1]<='9')
{n=n+1;
for(;n<i;n++){
m=m*10+(p[n]-48);
}
m=-m;
}
else
for(;n<i;n++){
m=m*10+(p[n]-48);
}
q->data1=m;
q->data3=0;
q->next=NULL;
tail->next=q;
tail=q;
}
else
{
q=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
q->data2=p[i-1];
q->data3=1;
q->next=NULL;
tail->next=q;
tail=q;
}n=i+1;m=0;j=n;
}
i++;
}
q=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
q->data2=p[k-1];
q->data3=1;
q->next=NULL;
tail->next=q;
r=head->next;
while(r)
{
if(r->data3==0)
push(s,r->data1);
else if(r->data3==1)
{
pop(s,&x2);
pop(s,&x1);
if(r->data2=='+')
{
x1=x1+x2;
push(s,x1);
}
if(r->data2=='-')
{
x1=x1-x2;
push(s,x1);
}
if(r->data2=='*')
{
x1=x1*x2;
push(s,x1);
}
if(r->data2=='/')
{
x1=x1/x2;
push(s,x1);
}
}
r=r->next;
}
printf("结果为:%d",s->next->data1);
return 1;
}
LinkedStack init()
{
LinkedStack top;
top=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
if(top!=NULL)
top->next=NULL;
return top;
}
int push(LinkedStack top,elmtype x)
{
LinkedStackNode *node;
node=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
if(node==NULL)
return 0;
else
{
node->data1=x;
node->next=top->next;
top->next=node;
return 1;
}
}
int pop(LinkedStack top,elmtype *x)
{
LinkedStackNode *node;
if(top->next==NULL)
return 0;
else
{
node=top->next;
*x=node->data1;
top->next=node->next;
free(node);
return 1;
}
}