代码随想录-039-LeetCode150.逆波兰表达式求值

前言

“代码随想录”刷题记录。总结笔记均会放在“算法刷题-代码随想录”该专栏下,以下为原文的链接。
代码随想录此题链接

题目

根据 逆波兰表示法,求表达式的值。

有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

注意 两个整数之间的除法只保留整数部分。

可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 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.栈匹配

思路(定义变量)

  • 申请一个栈对象stack记录相邻的元素是否相同。

2. 本题思路分析:

  • 遇到四种运算符其中之一,将栈中的前两个元素进行响应的操作。
  • 如果是遇到操作数,将操作数存储在栈中。

3. 算法实现

  • 代码:
    Java
public int evalRPN(String[] tokens) {
   int num1 = 0,num2 = 0;
    Deque<Integer> stack = new ArrayDeque<Integer>();
    for(String tok:tokens){
        if("+".equals(tok)){
            num1 = stack.pop();
            num2 = stack.pop();
            stack.push(num1 + num2);
        }else if("-".equals(tok)){
            num1 = stack.pop();
            num2 = stack.pop();
            stack.push(num2 - num1);
        }else if("*".equals(tok)){
            num1 = stack.pop();
            num2 = stack.pop();
            stack.push(num1 * num2);
        }else if("/".equals(tok)){
            num1 = stack.pop();
            num2 = stack.pop();
            stack.push(num2 / num1);
        }else{
            stack.push(Integer.parseInt(tok));
        }
    }
    return stack.pop();
}

C++

#include<stack> 
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int evalRPN(vector<string>& tokens) {
    stack<int> st;                
    for(string t : tokens){
        int val1,val2,sum;
        if(t == "+"){
            val1 = st.top();
            st.pop();
            val2 = st.top();
            st.pop();
            sum =  val2 + val1;
            st.push(sum);
        }else if(t == "-"){
            val1 = st.top();
            st.pop();
            val2 = st.top();
            st.pop();
            sum = val2 - val1;
            st.push(sum);
        }else if(t == "*"){
            val1 = st.top();
            st.pop();
            val2 = st.top();
            st.pop();
            sum = val1 * val2;
            st.push(sum);
        }else if(t == "/"){
            val1 = st.top();
            st.pop();
            val2 = st.top();
            st.pop();
            sum = val2 / val1;
            st.push(sum);
        }else{
            st.push(atoi(t.c_str()));
        }
    }
    return st.top();
}

4. pop函数的算法复杂度

  1. 时间复杂度:O(n)
  2. 空间复杂度:O(n)

5. 算法坑点

  1. 除法和减法,被除数和被减数是先入栈的数,所以应该是第二次获取栈顶的元素作为被减数或者被除数。
else if(t == "-"){
    val1 = st.top();
    st.pop();
    val2 = st.top();
    st.pop();
    sum = val2 - val1;
    st.push(sum);
}
  1. c++中将string类型对象(内容为数字)与int类型对象相互转换的方法

string -> int

string s = "123";
int i = atoi(s.c_str());

int -> string

#include <sstream>
using namespace std;
int main(){
	stringstream stream;
	int i = 123;
	string s;
	stream << i;
	stream >> s;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值