leetcode刷题(4)

简介: 各位朋友们,大家好。这两天我将为大家分享我在学习栈的过程中遇到的题目,我们一起来看看。

逆波兰表达式求值

leetcode之逆波兰表达式求值(难度:中等)


题目要求

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。


注意:


有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。

每个操作数(运算对象)都可以是一个整数或者另一个表达式。

两个整数之间的除法总是 向零截断 。

表达式中不含除零运算。

输入是一个根据逆波兰表示法表示的算术表达式。

答案及所有中间计算结果可以用 32 位 整数表示。


用例输入

示例 1:

输入:tokens = [“2”,“1”,“+”,“3”,“*”]

输出:9

解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9


示例 2:

输入:tokens = [“4”,“13”,“5”,“/”,“+”]

输出:6

解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6


示例 3:

输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,““,”/“,””,“17”,“+”,“5”,“+”]

输出:22

解释:该算式转化为常见的中缀算术表达式为:

((10 * (6 / ((9 + 3) * -11))) + 17) + 5

= ((10 * (6 / (12 * -11))) + 17) + 5

= ((10 * (6 / -132)) + 17) + 5

= ((10 * 0) + 17) + 5

= (0 + 17) + 5

= 17 + 5

= 22


提示

提示:

1 <= tokens.length <= 104

tokens[i] 是一个算符(“+”、“-”、“*” 或 “/”),或是在范围 [-200, 200] 内的一个整数


做题思路

很多人看到这个题目的时候可能搞不懂这个题目在说什么,什么是逆波兰表达式呢?平常的四则运算我们知道吧,就像这种1 + ( 2 - 3 * 4 ) / 5 + 6,这种运算符在数字中间的形式叫做中缀表达式,而逆波兰表达式或者说后缀表达式就是运算符在数字的后面。那么我们该怎样做这道题呢?最好的方法就是运用栈这种数据结构来解决,栈有先进后出,一端进出的特性。当我们遇到数字的时候就将数字放进栈中,当遇到运算符的时候我们就从栈顶取出两个数字,第一次从栈顶取出的数字作为运算符的右值,第二次从栈顶取出的数字作为运算符的左值,然后将运算结果再放进栈中,最后返回栈底的数据就是我们想要的结果。


代码实现


c语言实现代码

int toInt(char* arr)
{
    int flag = 1;
    char* cur = arr;
    if (*cur == '-')
    {
        flag = -1;
        cur++;
    }
    if (*cur == '+')
    {
        cur++;
    }
    int ret = 0;
    while (*cur != '\0')
    {
        ret = ret * 10 + (*cur - '0');
        cur++;
    }
    return ret*flag;
}
int evalRPN(char** tokens, int tokensSize) {
//因为c语言并没有为我们直接提供栈的函数,所以我们需要自己模拟出来一个栈
    int* arr = (int*)malloc(tokensSize * sizeof(int));
    //tail是栈顶所在的下标
    int tail = 0;
    for (int i = 0; i < tokensSize; i++)
    {
        if (strcmp(tokens[i], "+") == 0 || strcmp(tokens[i], "-") == 0
            || strcmp(tokens[i], "*") == 0 || strcmp(tokens[i], "/") == 0)
        {
        //从栈顶取出两个数据
            int num2 = arr[--tail];
            int num1 = arr[--tail];
            switch (tokens[i][0])
            {
            case '+':
                arr[tail++] = num1 + num2;
                break;
            case '-':
                arr[tail++] = num1 - num2;
                break;
            case '*':
                arr[tail++] = num1 * num2;
                break;
            case '/':
                arr[tail++] = num1 / num2;
                break;
            }
        }
        else
        {
        //因为传进来的是字符串数组,所以我们需要将字符串转换为整数,
        //这里是我自己实现的,你也可以使用c语言提供的atoi函数将字符串转化为整数
            int ret = toInt(tokens[i]);
            arr[tail++] = ret;
        }
    }
    return arr[tail-1];
}

65.png

不懂atoi函数的可以看看这篇文章

image.png


Java语言实现代码

class Solution {
//这个方法是判断是否为运算符的
    private boolean isOperation(String x) {
        if(x.equals("+") || x.equals("-") || x.equals("*") || x.equals("/")) {
            return true;
        }
        return false;
    }
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for(String x:tokens) {
            if(!isOperation(x)) {
                stack.push(Integer.parseInt(x));
            } else {
                int num2 = stack.pop();
                int num1 = stack.pop();
                switch(x) {
                    case "+":
                    stack.push(num1+num2);
                    break;
                    case "-":
                    stack.push(num1-num2);
                    break;
                    case "*":
                    stack.push(num1*num2);
                    break;
                    case "/":
                    stack.push(num1/num2);
                    break;
                }
            }
        }
        return stack.pop();
    }
}

67.png

有效的括号


这个是我对上一篇文章的Java代码实现的补充,思路在我的这一片文章中,希望大家可以去看看。

leetcode刷题(3)


Java代码实现

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if(ch == '(' || ch == '{' || ch == '[') {
                stack.push(ch);
            } else {
                if(stack.empty()) {
                    return false;
                }
                char ch2 = stack.peek();
                if(ch == ')' && ch2 == '(' || ch == ']' && ch2 == '[' || ch == '}' && ch2 == '{') {
                    stack.pop();
                } else {
                    return false;
                }
            }
        }
        if(!stack.empty()) {
            return false;
        }
        return true;
    }
}

68.png

相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
51 4
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2
|
23天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
18 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
61 7
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
28 4
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
28 4