Stack和quque

news2024/11/18 17:48:24

102. 二叉树的层序遍历 - 力扣(LeetCode)

如图:层序遍历即一层一层遍历,从左到右。

先遍历第一层,把第一层的节点放到队列里面,levesize=q.size(),即代表队列里面有多少个值。

然后现在把队里里面的值清空,放到vector里面(每一层的值都放一个vectot里面)。再把第二层的节点传到队列里面。levesize也根据队列的size产生变化:

以此类推,最终效果为:

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
    queue<TreeNode*> q;//套用树模版来个队列
       vector<vector<int>> vv;//最后把遍历完的数据放到vv里
       int levesize=0;
    if(root) q.push(root);
    levesize=1;
  

    while(!q.empty())//当队列不为空时
    {  vector<int> v;

      while(levesize--)
      {
        TreeNode* Front=q.front();
        q.pop(); 
        v.push_back(Front->val);
         if(Front->left) q.push(Front->left);
         if(Front->right) q.push(Front->right);
      }
      levesize=q.size();

  vv.push_back(v);
    }
        
        return vv;
    
    }
};

150. 逆波兰表达式求值 - 力扣(LeetCode)

这道题实际上就用后缀和去实现运算:

平时我们的运算都是中缀运算,如1+2*3,1+2是不能先算的,因为我们不能确定后面操作符,后面操作符的优先级如果比“+”优先级大那么1+2就不能 先运算,应该先运算2*3,然后得到的结构再去+1.

列如我们有一个这样的式子:((2 + 1) * 3) = 9。如果用后缀运算,就是把

((2 + 1) * 3) = 9变换成2  1 + 3  *。

至于怎么变成后缀的,这道题已经帮我们编好了,我们只需要把它编好的数据入栈就行了:

 然后后进先出,先从操作数里取两个数出来,为什么取两个出来呢?因为一个操作符肯定需要两个操作数进行操作。然后操作完之后再入栈:

 代码:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {


stack<int>  st;


for(auto str:tokens)
{
    if( str=="+"
        ||str=="-"
        ||str=="*"
        ||str=="/"
      )
         {
             int right=st.top();
             st.pop();
             int left=st.top();
             st.pop();
             switch(str[0])
             {
                  case '+':
                  st.push(left+right);
                  break;
                  case '-':
                  st.push(left-right);
                  break;
                  case '*':
                  st.push(left*right);
                  break;
                  case '/':
                  st.push(left/right);
                  break;
             }
         }
         else
         {
             st.push(stoi(str));
         }

}
return st.top();
    }
};

模拟实现一下栈,然后测一下上面这个逆波兰表达式:

首先把写一个模版,这个模版里面我们除了放T这个类型之外还要再放个参数:Container,这个参数就是我们可以把vector,list等其他容易作为这个栈的底层,这个栈可以用其他容器的push_back,pop_back,size()等函数。

 写一下函数的定义:

 main函数把逆波兰那道题的代码复制过来:

然后写一个测试用例:

 传一个vector作为底层:

运行:

 传list作为底层:

 运行:

写一段如下代码验证一下deque sort和vector sort占用栈帧情况对比:


void test2()
{
    srand((size_t)time(0));
    const size_t  N = 100000;
    vector<int> v;
    deque<int> dq;
    v.reserve(N);
  
    for (size_t i = 0; i < N; i++)
    {
        auto e = rand;
        v.push_back((int)e);
        dq.push_back((int)e);
    }

    int begin1 = clock();
    sort(v.begin(), v.end());
    int end1 = clock();

    int begin2 = clock();
    sort(dq.begin(), dq.end());
    int end2 = clock();


    cout << "vector sort:" << end1 - begin1 << endl;
    cout << "deque sort:" << end2 - begin2 << endl;
}

 然后再把deque给vector来跑



void test2()
{
    srand((size_t)time(0));
    const size_t  N = 100000;
    vector<int> v;
    deque<int> dq;
    v.reserve(N);

    for (size_t i = 0; i < N; i++)
    {
        auto e = rand;
        v.push_back((int)e);
        dq.push_back((int)e);
    }

    int begin1 = clock();
    sort(v.begin(), v.end());
    int end1 = clock();

    int begin2 = clock();
    v.assign(dq.begin(), dq.end());
    sort(v.begin(), v.end());

    int end2 = clock();


    cout << "vector sort:" << end1 - begin1 << endl;
    cout << "deque sort:" << end2 - begin2 << endl;
}





 

queue.h

#pragma once
#include<iostream>
#include<deque>
namespace bitt
{	template<class T, class Container = deque<T>>
	class queue
	{
	public:

	

		void push(const T& x)
		{
			_con.push_back(x);
		}
	
		void pop()
		{
			_con.pop_front();
		}
        const T& front()
		{
			return _con.front();
		}
		const T& back()
		{
			return _con.back();
		}
	
		bool empty()
		{
			return _con.empty();
		}
	

		size_t size()
		{
			return _con.size();
		}


	private:
		Container _con;
	};



}

main


void test_queue()
{
    bitt:: queue<int> q;
    q.push(1);
    q.push(2);
    q.push(3);
    q.push(4);
    q.push(5);
   while(!q.empty())
    {
       cout << q.front()<<" ";
       q.pop();
    }
   cout << endl;
}

int main()
{

test_queue();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1065064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔试编程ACM模式JS(V8)、JS(Node)框架、输入输出初始化处理、常用方法、技巧

目录 考试注意事项 先审完题意&#xff0c;再动手 在本地编辑器&#xff08;有提示&#xff09; 简单题515min 通过率0%&#xff0c;有额外log 常见输入处理 str-> num arr&#xff1a;line.split( ).map(val>Number(val)) 初始化数组 new Array(length).fill(v…

windows terminal终端美化

1&#xff0c;安装Windows terminal 可以选择window商店安装或者GitHub安装&#xff0c;安装步骤省略。 2.oh my posh 安装 安装步骤可以选择window 商店或者GitHub安装&#xff0c;步骤省略 3.安装字体 nerd font[官网链接] 4.配置 oh my posh ####第一次要输入以下命…

视频号规则改动,不再支持拍单,传统无货源模式已行不通!

视频号小店批量铺货行不通了&#xff0c;大家好我是派大星&#xff0c;这两天视频号发布了一个公告&#xff0c; 核心信息呢就是10月7号&#xff0c;视频号小店&#xff0c;将无法直接查看消费者的详细下单信息&#xff0c;只能通过电子面单的形式&#xff0c;打单发货。每个店…

RDP协议流程详解(二)Basic Settings Exchange 阶段

RDP连接建立过程&#xff0c;在Connection Initiation后&#xff0c;RDP客户端和服务端将进行双方基础配置信息交换&#xff0c;也就是basic settings exchange阶段。在此阶段&#xff0c;将包含两条消息Client MCS Connect Initial PDU和Server MCS Connect Response PDU&…

vulnhub靶机doubletrouble

下载地址&#xff1a;doubletrouble: 1 ~ VulnHub 主机发现 arp-scan -l 端口扫描 nmap --min-rate 1000 -p- 192.168.21.151 端口服务扫描 nmap -sV -sT -O -p22,80 192.168.21.151 漏洞扫描 nmap --scriptvuln -p22,80 192.168.21.151 先去看看web页面 这里使用的是qdpm …

【JavaEE重点知识归纳】第5节:方法

目录 一&#xff1a;方法的概念和使用 1.什么是方法 2.方法的定义 3.方法的调用过程 4.实参和形参的关系&#xff08;重点&#xff09; 二:方法重载 1.方法重载概念 2.方法签名 三&#xff1a;递归 1.递归的概念 2.递归执行的过程分析 一&#xff1a;方法的概念和使…

HttpStatusCodeException.getResponseBodyAsString 乱码

场景: 项目a进行了spring boot版本升级, 使用了2.7.15 项目b是做接口转发 (没升级spring boot版本, 用的是2.1.5) 调用过程: 请求方>>项目b>>项目a 现象: postman直接调用a中的接口, 接口报错, msg里的错误信息是正常显示 当调用接口报错时, msg里的错误信息是…

算法笔记:0-1背包问题

n个商品组成集合O&#xff0c;每个商品有两个属性vi&#xff08;体积&#xff09;和pi&#xff08;价格&#xff09;&#xff0c;背包容量为C。 求解一个商品子集S&#xff0c;令 优化目标 1. 枚举所有商品组合 共2^n - 1种情况 2. 递归求解 KnapsackSR(h, i, c)&#xff…

Vue中如何进行数据可视化雷达图展示

在Vue中进行数据可视化雷达图展示 数据可视化是将数据以图形方式呈现的过程&#xff0c;雷达图是其中一种常用的图表类型&#xff0c;用于可视化多个维度的数据。Vue.js作为一个流行的JavaScript框架&#xff0c;提供了许多工具和库来实现数据可视化。本文将介绍如何使用Vue来…

git与github的交互(文件与文件夹的上传)

git与github的交互&#xff08;文件与文件夹的上传&#xff09; 准备&#xff1a;gitHub账号&#xff08;创建一个新项目&#xff09;与Git软件的安装 一&#xff1a;开启公钥SSH登录&#xff08;之前配置过就跳过&#xff09; 1.安装SSH 在本地新创建文件夹负责装载项目&a…

Java虚拟机内存模型

JVM虚拟机将内存数据分为&#xff1a; 程序计数器、虚拟机栈、本地方法栈、Java堆、方法区等部分。 程序计数器用于存放下一条运行的指令&#xff1b; 虚拟机栈和本地方法栈用于存放函数调用堆栈信息&#xff1b; Java堆用于存放Java程序运行时所需的对象等数据&#xff1b…

桌面应用开发:Go 语言和 Web 技术的融合创新 | 开源日报 No.46

TheAlgorithms/Python Stars: 161.5k License: MIT 这个开源项目是一个用 Python 实现的算法库&#xff0c;旨在提供教育目的下使用的各种算法。 提供了大量常见算法的 Python 实现。适合学习和教育目的&#xff0c;可以帮助读者更好地理解不同类型的算法。 airbnb/javascri…

AI:08-基于深度学习的车辆识别

随着汽车行业的迅速发展,车型识别在交通管理、智能驾驶和车辆安全等方面变得越来越重要。基于深度学习的车型识别技术为实现高效准确的车辆分类和检测提供了强大的工具。本文将介绍如何利用深度学习技术来实现车型识别,并提供相应的代码示例。 数据收集和预处理: 为了训练…

PHP 行事准则:PHP 配置文件

文章目录 参考环境PHP 行事准则PHP 配置文件php.ini-production 与 php.ini-development生产配置文件开发配置文件配置文件的应用版本差异 修改配置的生效 PHP 运行时配置ini_set()布尔配置项限制 phpinfo()phpinfo 页面Core 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一…

软件设计师学习笔记11-磁盘管理+IO管理软件+文件管理+作业管理

目录 1.磁盘管理 1.1磁盘(了解一下) 1.2读取磁盘数据的时间 1.3 磁盘调度算法 1.3.1常见的磁盘调度 1.3.2 先来先服务(FCFS) 1.3.3 最短寻道时间优先(SSTF) 1.4 例题补充(均来自希赛软考) 1.4.1 单/双缓冲区花销时间的计算 1.4.2 SSTF 1.4.3 磁道物理块花销时间计算…

UE5.1编辑器拓展【三、脚本化资产行为,删除无引用资产】

目录 需要考虑的问题 重定向的修复函数 代码&#xff1a; 删除无引用资产 代码 需要添加的头文件和模块 在我们删除资产的时候&#xff0c;会发现&#xff0c;有些资产在删除的时候会出现有被什么什么引用&#xff0c;还有的是没有被引用。 而我们如果直接选择一片去进行…

Qt的WebEngineView加载网页时出现Error: WebGL is not supported

1.背景 当我在qml中使用WebEngineView加载一个网页时&#xff0c;出现以下错误&#xff1a; Error: WebGL is not supported 2.解决方案 其实这个问题在Qt的帮助文档中已经提及了解决办法&#xff1a; 因此&#xff0c;可以按照下面的步骤操作一下&#xff1a; 2.1.pro文件 …

win10、win11彻底永久关闭自动更新的方法

win10、win11彻底永久关闭自动更新的方法 前言彻底关闭自动更新方法步骤一、禁用Windows Update服务二、在组策略里关闭Win10自动更新相关服务四、在注册表中关闭Win10自动更新 完结 前言 win系统的自动更新可谓是非常顽固&#xff0c;很多用户在网上试了各种关闭win系统自动更…

【DevExpress基础一】之MapControl的基础用法(含demo和png瓦片地图下载地址)

结果预览 定义一个自定义控件 需要定义以下几个变量: MapControl,地图控件变量ImageLayer,地图切片数据层VectorItemsLayer,地图矢量图层MapItemStorage,矢量图层的Storage// 添加 MapControl 控件 public MapControl map = new MapControl(

二叉树的经典OJ题

对称二叉树 1.题目2.图形分析3.代码实现 1.题目 2.图形分析 3.代码实现 class Solution {public boolean isSymmetric(TreeNode root) {if(root null){return true;}return isSymmetricchild(root.left,root.right);}private boolean isSymmetricchild(TreeNode leftTree,Tre…