表达式求值

表达式求值

表达式的计算主要步骤可以分成两个:
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;
}

代码运行测试

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值