用栈计算中缀表达式(具体详细,还包含getchar的用法)

本文详细介绍了如何利用两个栈,一个存储数字,一个存储运算符,来计算中缀表达式。关键步骤包括判断字符是数字还是运算符,比较运算符优先级,以及执行相应的计算。在处理过程中,特别提到了处理运算符栈和数字栈的逻辑,以及解决getchar()的缓冲区问题和循环条件的设定。

标题## 用栈计算中缀表达式

中缀表达式也就是我们常说的普通数学表达式,那么怎么用栈来计算呢?请听我一一分解。
我们基本的思路是用两个栈来分别存储表达式中的数字和运算符,在通过有序的出栈来进行计算。(我用OPTR代表运算符栈,OPND代表运算数字栈)
方便判断表达式的结束,我会在运算符栈第一个元素和表达式后面加一个#
在此之前,先要把基础的功能函数写出来
1.判断是数字还是运算符

//判断计算表达式中下一个字符是数字还是运算符 ,返回0是代表运算数字,返回1代表运算符号 
int in(char ch)
{
   
   
	switch(ch)
	{
   
   
		case '0': case '1': case '2': case '3': case '4':
	  	case '5': case '6': case '7': case '8': case '9':
	  		return 1;
	  		break;
	  	default: 
	  		return 0;
	}
}

2.比较运算符优先级的函数(这个是最关键的)
在给出代码之前,我先给一张对比表给大家看看
在这里插入图片描述
图片中的θ2表示运算符栈的栈顶元素,θ1表示读取到的运算符
大于号表示θ2的优先级高于θ1,小于就相反,等于就优先级相等
(下面代码我就用1,0,-1依次代表大于,等于,小于)

int precede(char topch,char ch)
{
   
   
	if(topch=='+'||topch=='-')
	{
   
   
		if(ch=='+'||ch=='-'||ch=='#'||ch==')')
		{
   
   
			return 1; 
		}
		else
		{
   
   
			return -1;
		} 
	}
	else if(topch=='*'||topch=='/')
	{
   
   
		if(ch=='(')
		{
   
   
			return -1;
		}
		else
		{
   
   
			return 1;
		} 
	}
	else if(topch=='('
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值