表达式求值
表达式的计算主要步骤可以分成两个:
1.利用一个栈将中缀表达式转换为后缀表达式
2.再利用一个栈计算后缀表达式
全部代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<malloc.h>
#define Initsize 100
typedef struct
{
int *top;
int *base;
int stacksize;
}Stack1;
void Initstack1(Stack1 *s)
{
s->base=(int*)malloc(sizeof(int)*Initsize);
s->top=s->base;
s->stacksize=Initsize;
}
void push1(Stack1 *s,int f)
{
if(s->top-s->base==s->stacksize )
{
printf("栈已满,追加空间");
s->base=(int*)realloc(s->base,sizeof(int)*(s->stacksize +10));
s->top=s->base+s->stacksize ;
s->stacksize +=10;
}
*(s->top)=f;
s->top++;
}
void pop1(Stack1 *s,int *f)
{
if(s->top==s->base )
return;
s->top--;
*f=*(s->top);
}
bool empty1(Stack1 s)
{
if(s.top==s.base )
return true;
return false;
}
typedef struct
{
char *top;
char *base;
int stacksize;
}Stack2;
void Initstack(Stack2 *s)
{
s->base=(char*)malloc(sizeof(char)*Initsize);
s->top=s->base;
s->stacksize=Initsize;
}
void push(Stack2 *s,char f)
{
if(s->top-s->base==s->stacksize )
{
printf("栈已满,追加空间");
s->base=(char *)realloc(s->base,sizeof(char)*(s->stacksize +10));
s->top=s->base+s->stacksize ;
s->stacksize +=10;
}
*(s->top)=f;
s->top++;
}
void pop(Stack2 *s,char *f)
{
if(s->top==s->base )
return;
s->top--;
*f=*(s->top);
}
bool empty(Stack2 s)
{
if(s.top==s.base )
return true;
return false;
}
char gettop(Stack2 s)
{
return *(--s.top);
}
//表达式求值
//先将中缀表达式转化为后缀表达式,然后再进行后缀表达式的求解
void zhongzhuanhou(char *str,char *p)
{
Stack2 s;
Initstack(&s);
char ch,a;//用来存放后缀表达式
int len=strlen(str) ;
int i,j=0;
for(i=0;i<len;i++)
{
//当是数字就直接加入到后缀表达式中
if(str[i]>='0'&&str[i]<='9'||str[i]=='.')
p[j++]=str[i];
else if(str[i]=='+'||str[i]=='-')
{
while(!empty(s))
{
a=gettop(s);
if(a=='(')
break;
else
{
pop(&s,&ch);
p[j++]=ch;
}
}
push(&s,str[i]);
}
else if(str[i]=='*'||str[i]=='/')
{
while(!empty(s))
{
a=gettop(s);
if(a=='*'||a=='/')
{
pop(&s,&ch);
if(a=='*'||a=='/')
p[j++]=ch;
}
else
break;
}
push(&s,str[i]);
}
else if(str[i]=='(')
{
push(&s,str[i]);
}
else if(str[i]==')')
{
pop(&s,&ch);
while(ch!='(')
{
p[j++]=ch;
pop(&s,&ch);
}
}
}
while(!empty(s))
{
pop(&s,&ch);
p[j++]=ch;
}
p[j]='\0';
}
//后缀表达式的计算
int jisuanhouzhui(char *str)
{
Stack1 s;
Initstack1(&s);
int len=strlen(str);
int i;
int a,b;
//char p[100];//暂时存放字符串用于将字符串转化为int
for(i=0;i<len;i++)
{
if(str[i]>='0'&&str[i]<='9')
{
//j=0;
//while(str[i]>='0'&&str[i]<='9'||str[i]=='.')
//{
// p[j++]=str[i++];
//}
// p[j]='\0';
int f=str[i]-48;
push1(&s,f);
}
else
{
pop1(&s,&a);
pop1(&s,&b);
switch(str[i])
{
case '+':
push1(&s,b+a);
break;
case '-':
push1(&s,b-a);
break;
case '*':
push1(&s,b*a);
break;
case '/':
push1(&s,b/a);
break;
}
}
}
int end;
pop1(&s,&end);
return end;
}
int main()
{
char p[100],s[100];
printf("输入一个表达式");
gets(s);
zhongzhuanhou(s,p);
printf("%s转化为后缀表达式为%s\n",s,p);
int end=jisuanhouzhui(p);
printf("%s=%d",s,end);
return 0;
}