【牛客刷题专栏】0x04:C数据结构栈实现逆波兰表达式求值及其重点讲解

前言


问题描述:

给定一个逆波兰表达式,求表达式的值。
在这里插入图片描述


输入描述:

[“2”,“1”,“+”,“4”,“*”]


输出描述:

12


举例:

//输入:
["2","1","+","4","*"]
//输出:
12

//输入:
["2","0","+"]
//输出:
2

解法思路:

  • 因为输入是逆波兰表达式,因此一定是满足波兰表达式的,即是一个满足数据结构栈的标准输入。因此无需考虑输入错误等其他情况,直接使用栈实现就行,可使用结构体实现栈便可以了。
  • 本题中使用的结构体其实可以直接用一个数组来代替,类似上一章节:【牛客刷题专栏】0x03:栈的压入、弹出序列

代码结果:

int evalRPN(char** tokens, int tokensLen ) {
    struct{
        int integer[10000];
        int topIdx;
    }str={{0},0};
    for(int i=0,j=0;i<tokensLen;i++)
    {
        if(strcmp(tokens[i],"+")==0)
        {
            str.integer[str.topIdx-2]=str.integer[str.topIdx-2]+str.integer[str.topIdx-1];//先入栈的加后入栈的
            str.topIdx--;
        }
        else if(strcmp(tokens[i],"-")==0)
        {
            str.integer[str.topIdx-2]=str.integer[str.topIdx-2]-str.integer[str.topIdx-1];//先入栈的减后入栈的
            str.topIdx--;

        }
        else if(strcmp(tokens[i],"*")==0)
        {
            str.integer[str.topIdx-2]=str.integer[str.topIdx-2]*str.integer[str.topIdx-1];//先入栈的乘以后入栈的
            str.topIdx--;
        }
        else if(strcmp(tokens[i],"/")==0)
        {
            str.integer[str.topIdx-2]=str.integer[str.topIdx-2]/str.integer[str.topIdx-1];//先入栈的除以后入栈的
            str.topIdx--;
        }
        else{
            str.integer[str.topIdx]=atoi(tokens[i]);//数字入栈
            str.topIdx++;
        }
    }
    return str.integer[0];//结果返回,运算结束结果一定是在栈底的
}

重点难点:

  • 比较字符串
    要使用 strcmp() == 0 比较字符串,而不是简单的 == ,它只会比较指针是否相同。
    tokens[i]是指向字符串的指针(指向以空字符结尾的字符数组的指针),如 “+“或 “1”。注意,输入参数char* tokens是一个二级指针,因此tokens[i]是指向字符串的指针。*
    表达式tokens[i]==”+“检查两个指针​​是否相同(指向相同的内存位置)。
    表达式strcmp(tokens[i],”+”)==0将检查两个字符串的内容是否相同。
    函数位置:C 标准库 - <string.h>
    函数声明: int strcmp(const char *str1, const char *str2)
  • 字符串转换为一个整数
    C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
    这里要使用atoi(),而不是(int)强制转换,因为字符串本质上是数组,是多个元素,而不是一个变量。
    函数位置:C 标准库 - <stdlib.h>
    函数声明:int atoi(const char *str)

结束语

  • 以上就是C数据结构栈实现逆波兰表达式求值及其重点讲解的内容。可以在牛客尝试刷几道单链表题目来练习实践。牛客网刷题(点击可以跳转),可以尝试注册使用。
    在这里插入图片描述
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不僈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值