中缀表达式求值

中缀表达式求值

合理运用栈,按照运算优先级,编程实现任意中缀算术表达式(可以只包含’+’、’-‘、’*’、’/’等双目运算符、小括号和结束符)的求值运算。

通过操作符栈和操作数栈实现求值。
遇见数字,直接压入操作数栈,遇见操作符时:
1.当栈外优先级高于栈内优先级时:将操作符压入栈
2.当栈外优先级低于栈内优先级时:输出栈顶的操作符,从操作数栈中取出栈顶的两个数进行计算后的结果压入栈
3.当栈外优先级等于栈内优先级时,如果操作符栈栈顶=’(’,退栈不输出

相同等级运算符栈内高于栈内

int isp(char op)
{
	switch(op)
	{
		case '#':return 0;break;
		case '(':return 1;break;
		case '*':return 5;break;
		case '/':return 5;break;
		case '+':return 3;break;
		case '-':return 3;break;
		case ')':return 6;break;
	}
}
int icp(char op)
{
	switch(op)
	{
		case '#':return 0;break;
		case '(':return 6;break;
		case '*':return 4;break;
		case '/':return 4;break;
		case '+':return 2;break;
		case '-':return 2;break;
		case ')':return 1;break;
	}
}

完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define stsize 50
#define maxsize 100
int isp(char op)
{
	switch(op)
	{
		case '#':return 0;break;
		case '(':return 1;break;
		case '*':return 5;break;
		case '/':return 5;break;
		case '+':return 3;break;
		case '-':return 3;break;
		case ')':return 6;break;
	}
}
int icp(char op)
{
	switch(op)
	{
		case '#':return 0;break;
		case '(':return 6;break;
		case '*':return 4;break;
		case '/':return 4;break;
		case '+':return 2;break;
		case '-':return 2;break;
		case ')':return 1;break;
	}
}
bool dooperator(double opnd[],int *k,char op)
{
	double left,right;
	int t=*k;
	if(t==-1)
	{
		return false; 
	}
	right=opnd[t--];
	if(t==-1)
	{
		return false;
	}
	left=opnd[t--];
	switch(op)
	{
		case '+':opnd[++t]=left+right;break;
		case '-':opnd[++t]=left-right;break;
		case '*':opnd[++t]=left*right;break;
		case '/':
			if(right==0)
			{
				printf("不能除以0\n");
				return false;
			}
			else
			{
				opnd[++t]=left/right;
			}
			break;
		default: return false;
	}
	return true;
}
double cal(char in[])
{
	int i=0,j=0,k=-1,m;
	double opnd[stsize];
	char ch=in[i++],str[stsize];
	char optr[stsize],ch1,op;
	int top=-1;
	optr[++top]='#';
	while(ch!='#')
	{
		if(ch>='0'&&ch<='9'||ch=='.')
		{
			while(ch>='0'&&ch<='9'||ch=='.')
			{
				str[j++]=ch;
				ch=in[i++];
			}
			opnd[++k]=strtod(str,NULL);
			for(m=0;m<j;m++)
			{
				str[m]='#';
			}
			j=0;	
		}
		else
		{
			ch1=optr[top];
			if(isp(ch1)<icp(ch))
			{
				optr[++top]=ch;
				ch=in[i++];
			}
			else if(isp(ch1)>icp(ch))
			{
				while(isp(ch1)>icp(ch))
				{
					op=optr[top--];
					if(!dooperator(opnd,&k,op))
					{
						printf("运算出错\n");
					}
					else
					{
						k--;
					}
				    ch1=optr[top];
				}
				if(isp(ch1)==icp(ch))
				{
					op=optr[top--];
				}
				if(isp(ch1)<icp(ch))
				{
					optr[++top]=ch;
				}
				ch=in[i++];
			}
			else
			{
				op=optr[top--];
				if(op=='(')
				ch=in[i++];
			}
		}
	}
	while(top!=-1)
	{
		op=optr[top--];
		if(!dooperator(opnd,&k,op));
		else
		{
			k--;
		}
	}
	return opnd[k--];
}
int main()
{
	char in[maxsize];
	gets(in);
	printf("运算结果为:%lf\n",cal(in));
}

对于浮点数或着多位数,入栈时要形成一个整体。我是通过建立一个字符串数组存入数字,再将数字转化为一个浮点数压入栈。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值