逆波兰表达式的概念
又称为后缀表达式,其特点是操作符位于操作数之后,目前,这儿只解决传入的字符串为逆波兰表达式的问题!!
例如:表达式为: int ptr[] = { 12, 3, 4 , ‘+’, ‘*’, 6, ‘-‘, 8, 2, ‘/’, ‘-‘}; 已经将此表达式放入数组中存储
那么如何解决此类问题呢??
思路在此
代码敬上
//b、逆波兰表达式(后缀表达式)求值
int IsNumber(char ch) //判断该字符是否为数字 ,是返回1, 不是返回0
{
if ('-' == ch || '+' == ch ||
'*' == ch || '/' == ch)
return 0;
else
return 1;
}
int RPNValue(int* Ptr, int _size)
{
assert(Ptr); //参数检测
StackD s;
int size = _size;
int i = 0;
StackDInit(&s, size); //定义栈
if ('\0' == (char)Ptr[i]) //空的逆波兰表达式
{
printf("逆波兰表达式为空,无法计算!!\n");
return 0;
}
else
{
for (; i < size; i++) //遍历整个表达式
{
if (IsNumber(Ptr[i])) //检测到是数字------>入栈
StackDPush(&s, Ptr[i]);
else //检测到是运算符
{
if (StackDSize(&s) < 2) //栈中没有两个操作数
{
printf("逆波兰表达式有误,无法计算!!\n");
return 0;
}
else //栈中操作数满足运算
{
int tem = 0;
int right = StackDTop(&s); //拿出右操作数
StackDPop(&s);
int left = StackDTop(&s); //拿出左操作数
StackDPop(&s);
switch (Ptr[i]) //进行 + - * / 操作, 并且将计算出来的值入栈
{
case '+':
tem = left + right;
StackDPush(&s, tem);
break;
case '-':
tem = left - right;
StackDPush(&s, tem);
break;
case '*':
tem = left * right;
StackDPush(&s, tem);
break;
case '/':
if (right == 0) //被除数为零,不能计算
{
printf("逆波兰表达式被除数为零,无法计算!!!\n");
return 0;
}
else
{
tem = left / right;
StackDPush(&s, tem);
break;
}
}
}
}
}
if (StackDSize(&s) != 1) //遍历完表达式后,检测栈中是否只有一个操作数,不是则有误!
{
printf("逆波兰表达式操作数过多!!\n");
return 0;
}
else //若只有一个操作数,直接返回
{
return StackDTop(&s);
}
}
}
证据不假
其他问题
1、因为一般的问题,不会直接给出后缀表达式,所以有一个从中缀表达式转化为后缀表达式的过程咱们还没有解决!!
2、关于栈的基本操作!!可以click这个链接:https://blog.csdn.net/code_zx/article/details/80812635
3、希望各位路过的人类点一波关注!!
谢谢!!