当前位置 博文首页 > 白徽的博客:逆波兰表达式求值

    白徽的博客:逆波兰表达式求值

    作者:[db:作者] 时间:2021-07-15 19:04

    原本以为这道题分分钟就能做完,谁能想到,我特喵做了1个半小时。
    小丑竟是我自己!!!

    原题

    在这里插入图片描述

    很显然直接使用栈来解决就可以的题目。
    先说一下思路哈

    1. 开始循环vector。每一次都是一个独立的string字符串。
    2. 每一次遇见字符串的时候,请辨认一下,是否是操作符还是数字。
    3. 如果是数字,转化成int类型放进栈中,(为什么转化成int,方便后期直接拿来计算呀)
    4. 如果是操作符。从栈中提取两个最顶层的两个数字来进行运算。(这个时候还需要注意两个数字的顺序哈。否则又是GAMEOVER)

    在这里说一下,需要知道的基础的东西

    string转化为int类型

    请使用

    atoi()
    功能:将字符串str转换成一个整数并返回结果。参数str 以数字开头,当函数从str 中读到非数字字符则结束转换并将结果返回。例如,

    i = atoi( “512.035” );
    i 的值为 512.

    如果还是没懂,请看这个文章。

    至于如何判断不是操作数这个环节:
    请先检查string的长度是否是大于1的,或者第一个字符是不是数字。只要满足其中一个条件那就妥妥的数字了。

    为什么需要注意运算时的顺序呢?
    给大家一段代码,看一下

    				int a = stk.top();
                    stk.pop();
                    int b = stk.top();
                    stk.pop();
    

    如果此时我们的栈空间是这样的

    13 , 5

    请问a/b的结果是什么?
    你以为是 13 / 5 吗?
    错,会变成 5 / 13 。

    所以这里一定要注意

    到这里还没懂?OK,直接请你去看动画版

    最后上代码:

    
    class Solution {
    public:
        int evalRPN(vector<string>& tokens) {
            int len = tokens.size();
            stack<int> stk;
            for(int i = 0;i < len;i++){
                if(tokens[i].length() > 1 || isdigit(tokens[i][0])){
                    //如果字符串的长度是大于1的或者第一个字符为数字时,肯定是数字
                    //数字需要进栈,当然需要先转化为int
                    stk.push(atoi(tokens[i].c_str()));
                }else{
                    //说明此时是操作符,按照给定的操作符进行运算
                    int a = stk.top();
                    stk.pop();
                    int b = stk.top();
                    stk.pop();
    
                    switch(tokens[i][0]){
                        case '+':
                            stk.push(b + a);
                            break;
                        case '-':
                            stk.push(b - a);
                            break;
                        case '*':
                            stk.push(b * a);
                            break;
                        case '/':
                            // cout<<b<<" / "<<a<<" = "<<a/b<<endl;
                            stk.push(b / a);
                            break;
                    }
    
                    // cout<<stk.top()<<endl;
                }
            }
    
            return stk.top();
        }
    };
    
    cs
    下一篇:没有了