标题## 用栈计算中缀表达式
中缀表达式也就是我们常说的普通数学表达式,那么怎么用栈来计算呢?请听我一一分解。
我们基本的思路是用两个栈来分别存储表达式中的数字和运算符,在通过有序的出栈来进行计算。(我用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=='('

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

被折叠的 条评论
为什么被折叠?



