栈的应用之逆波兰表达式(后缀表达式)(C语言版)

逆波兰表达式的概念

又称为后缀表达式,其特点是操作符位于操作数之后,目前,这儿只解决传入的字符串为逆波兰表达式的问题!!

例如:表达式为: int ptr[] = { 12, 3, 4 , ‘+’, ‘*’, 6, ‘-‘, 8, 2, ‘/’, ‘-‘}; 已经将此表达式放入数组中存储

那么如何解决此类问题呢??

思路在此
栈的应用之逆波兰表达式(后缀表达式)(C语言版)_第1张图片

代码敬上

//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);
    }
}
}

证据不假
栈的应用之逆波兰表达式(后缀表达式)(C语言版)_第2张图片

其他问题
1、因为一般的问题,不会直接给出后缀表达式,所以有一个从中缀表达式转化为后缀表达式的过程咱们还没有解决!!
2、关于栈的基本操作!!可以click这个链接:https://blog.csdn.net/code_zx/article/details/80812635
3、希望各位路过的人类点一波关注!!
谢谢!!
栈的应用之逆波兰表达式(后缀表达式)(C语言版)_第3张图片

你可能感兴趣的:(学习笔记,每日一题)