栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

栈 1·栈的基础知识

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

1·1栈在C++当中常用的操作
#include 
#include "stack"
using namespace std;
int main(){
    stacks;
    //入栈
    s.emplace("ch");
    //返回栈顶元素
    string x=s.top();
    //出栈
    s.pop();
    return 0;
}
剑指 Offer II 036. 后缀表达式 分析

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

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

从左到右扫描这个数组。首先我们遇到的是操作数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& tokens) {
        stackStack;
        //循环遍历整个数组
        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 asteroidCollision(vector& asteroids) {
        stacktack;
        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);
            }
        }
        vectorarr;
        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 dailyTemperatures(vector& temperatures) {
            //因为数组在一开始就要分配内存空间,所以先获取数组的长度然后顶一个新的数组
            int n=temperatures.size();
            //定义一个栈
            vectorans(n);
            stackt;
            for(int i=0;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;
        }
    };
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867839.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号