栈-剑指 Offer II 036. 后缀表达式&&剑指 Offer II 037. 小行星碰撞&&剑指 Offer II 038. 每日温度

1·栈的基础知识

栈是一种常用的数据结构,它的最大特点是"FILO"先入后出

1·1栈在C++当中常用的操作

#include <iostream>
#include "stack"
using namespace std;
int main(){
    stack<string>s;
    //入栈
    s.emplace("ch");
    //返回栈顶元素
    string x=s.top();
    //出栈
    s.pop();
    return 0;
}

剑指 Offer II 036. 后缀表达式

分析

后缀表达式时一种算术表达式,它的操作符在操作数的后面

以题目当中的例子我们一起走一下整个过程

O1cEPH.png

从左到右扫描这个数组。首先我们遇到的是操作数2,由于这是后缀表达式,操作符还在后面。不知道操作符就不能够计算,所以先将2保存到栈中。接下来式1这个操作数,我们将其保存到栈中,之后我们遇到了"+“是操作符,我们已经知道如何计算了,那么前两个数字分别出栈,然后进行运算,2+1=3,结果完成之后,我们再将其结果入栈,之后我们遇到了操作数3我们将其入栈,最后我们遇到了操作符”*"我们知道怎么运算,那么我们将其中两个数字出栈3 *3=9,将这个元素保存起来返回就OK

代码

class Solution {
private:
//定义一个函数来进行加减乘除运算
    int calculate(int num1,int num2,string s){
        if(s=="+")
                return num1+num2;
        else if(s=="-")
                return num1-num2;
        else if(s=="*")
                return num1*num2;
        else if(s=="/")
                return num1/num2;
        else
                return 0;
    }
public:
    int evalRPN(vector<string>& tokens) {
        stack<int>Stack;
        //循环遍历整个数组
        for(string c:tokens){
            //如果遇到数字操作符那么就进行计算,否则就进行入栈操作
            if(c=="+"||c=="-"||c=="*"||c=="/"){
                int num1=Stack.top();
                Stack.pop();
                int num2=Stack.top();
                Stack.pop();
                Stack.push(calculate(num2,num1,c));
            }else{
                //stoi函数是将字符串转为10进制的zheng'shu
                Stack.push(stoi(c));
            }
        }
        return Stack.top();
    }
};

剑指 Offer II 037. 小行星碰撞

分析:

  1. 如果一个小行星向右飞行,那么它可以入栈,如果一个小行星向左飞行,而位于栈顶的小行星向右飞行,那么它将与位于栈顶的小行星相撞。

  2. 如果位于栈顶的小行星较小则爆炸消失即出栈。然后继续判断它是否将与下一颗小行星相撞,如果它与所有小行星相撞没有爆炸消失,那么它将入栈

class Solution {
public:
    vector<int> asteroidCollision(vector<int>& asteroids) {
        stack<int>tack;
        for(auto x:asteroids){
            //当栈不为空并且栈顶元素大于0的时候,同时栈顶的元素小于向左飞行的元素的相反数的时候,栈顶元素出栈
            while(!tack.empty()&&tack.top()>0&&tack.top()<-x){
                tack.pop();
            }
            //如果两个元素相等的时候,出栈
            if(!tack.empty()&&x<0&&tack.top()==-x){
                tack.pop();
                //如果栈顶元素大于0,或者栈为空,或者栈顶元素小于0的时候都直接入栈
            }else if(x>0||tack.empty()||tack.top()<0){
                tack.push(x);
            }
        }
        vector<int>arr;
        while(!tack.empty()){
            arr.push_back(tack.top());
            tack.pop();
        }
        reverse(arr.begin(), arr.end());
        return arr;
    }
};

剑指 Offer II 038. 每日温度

分析:

对于数组的每个温度,可以它后面的每个温度直到发现一个更高的温度为止。如果数组包含n天的温度,那么这种思路的时间复杂度为0(n^2)

  1. 假设输入的表示每天的温度数组为[35.31,33.36,34],第一天的温度为35,此时不知道后面会不会有对应更高的温度,所以先将它保存到一个数据容器中。第2天的温度是31度比第一天的温度低,同样也保存到容器中。第3天的温度为33,比第二天的温度高,由此可知,第2天需要等1天才有更高的温度

    class Solution {
    public:
        vector<int> dailyTemperatures(vector<int>& temperatures) {
            //因为数组在一开始就要分配内存空间,所以先获取数组的长度然后顶一个新的数组
            int n=temperatures.size();
            //定义一个栈
            vector<int>ans(n);
            stack<int>t;
            for(int i=0;i<temperatures.size();i++){
                //如果栈不为空同时第i天的温度大于栈顶那天的温度的时候
                while(!t.empty()&&temperatures[i]>temperatures[t.top()]){
                    //记录栈顶的元素值
                    int prev=t.top();
                    //出栈
                    t.pop();
                    //比第i天温度高的是 第i天减去-prev
                    ans[prev]=i-prev;
                }
                //将
                t.push(i);
            }
            return ans;
        }
    };
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HANWEN KE

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

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

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

打赏作者

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

抵扣说明:

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

余额充值