【C++】stack/queue

news2024/11/17 16:52:38

链表完了之后就是我们的栈和队列了,当然我们的STL中也有实现,下面我们先来看一下简单用法,跟我们之前C语言实现的一样,stack和queue有这么几个重要的成员函数

最主要的就是这么几个:empty,push,pop,top(front),size,为什么要说这几个重要的呢?因为我们发现,stack和queue并没有我们之前的容器的迭代器,说明它们跟之前学的容器并不同,它们叫做适配器

什么叫做适配器呢?我们听过笔记本电脑的电源适配器,它就是将220V的电压转化成电脑需要的电压,所以适配器的本质是转换回到我们这里,stack和queue这个适配器就可以将其他的容器转换成实例化后的stack和queue

我们可以看到,类模板的第二个参数是要传一个容器,当然不传也行,它是有缺省值的,这里的缺省值是deque,这个容器是介于vector和list之间的,为什么要有一个这样的容器呢?

我们首先来总结一下vector和list的优缺点

vector:优点是下标随机访问和缓存命中率高(缓存命中率就是指比如我要给定vector中连续几个元素的值,我要一个一个给定,当我给定第一个的时候,它并不是只把第一个给定到内存中,而是把它及周围的位置都拿到了内存中,这样我给定第二个值时,就不需要再拿入到内存中了),缺点是前面部分插入删除效率低,扩容有消耗

list:优点是任意位置插入删除效率高和按需申请释放(每次就申请一个节点的空间,不会浪费),缺点是不支持下标随机访问,缓存命中率低

我们可以来试一下

既然如此,我们要模拟实现的话,就不用像之前那么写了,而是跟库一样,模板参数传个容器,下面的几个关键函数赋用容器的就可以了

template<class T,class container>
class stack {
public:
	void push(const T& x) {
		_con.push_back(x);
	}
	void pop() {
		_con.pop_back();
	}
	bool empty() {
		return _con.size() == 0;
	}
	const T& top() {
		return _con.back();
	}
	size_t size() {
		return _con.size();
	}
private:
	container _con;
};
template<class T, class container>
class queue {
public:
	void push(const T& x) {
		_con.push_back(x);
	}
	void pop() {
		_con.pop_front();
	}
	bool empty() {
		return _con.size() == 0;
	}
	const T& front() {
		return _con.front();
	}
	size_t size() {
		return _con.size();
	}
private:
	container _con;
};

下面来几道有关的题来帮助我们更好的使用

这个题其实就是模拟我们人脑在做这种题时的想法,我们一般先看弹出顺序的第一个,然后看怎么怎么压入才会让它第一个弹出。第一个其实跟后边几个都一样,最后走到头,看栈是否为空,为空就是符合

class Solution {
  public:
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        stack<int>s;
        int n = popV.size();
        for (int pushi = 0, popi = 0; pushi < n && popi < n;) {
            while (s.empty() || s.top() != popV[popi]) {
                s.push(pushV[pushi++]);
                if (pushi == n)break;
            }
            while (!s.empty() && s.top() == popV[popi]) {
                s.pop();
                popi++;
            }
        }
        if (s.empty())return true;
        return false;
    }
};

这里实际上就是给你一个后缀表达式,让你求出表达式的值,我们人一般看的就是中缀表达式,那么后缀表达式是什么呢?其实就是把运算符放到两个操作数的后面。所以解题思路就是看到数字就入栈,看到运算符就从栈中取两个值进行运算,把结果再放到栈中,直到把后缀表达式走完

class Solution {
public:
    int evalRPN(vector<string>& t) {
stack<int>st;
for(auto e:t){
    if(e=="+"||e=="-"||e=="*"||e=="/"){
        int right=st.top();
        st.pop();
        int left=st.top();
        st.pop();
switch(e[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(e));
}
return st.top();
    }
};

我们这里是给定一个后缀表达式,那么我们应该如何求一个中缀表达式的后缀表达式呢?我这里简单实现了一下,可以传一个string,string里面要么是字母用来表示数字,要么是+-*/

string postfix(string s) {
	stack<char>st;
	string ret;
	for (int i = 0; i < s.size();) {
		char e = s[i];
		if (e == '+' || e == '-' || e == '*' || e == '/') {
			if (st.empty()) {
				st.push(e);
				i++;
			}
			else if ((e == '*' || e == '/') && (st.top() == '+' || st.top() == '-')) {
				st.push(e);
				i++;
			}
			else {
				ret += st.top();
				st.pop();
			}
		}
		else if (e == '(') {
			int j = i;
			int k = j;
			int num = 1;
			for (k = j+1; k < s.size(); k++) {
				if (s[k] == '(')num++;
				if (s[k] == ')'&&num==1)break;
				if (s[k] == ')')num--;
			}
			string tmp(s.begin() + j + 1, s.begin() + k);
			ret += postfix(tmp);
			i+=k-j+1;
		}
		else {
			ret += e;
			i++;
		}
	}
	while (!st.empty()) {
		ret += st.top();
		st.pop();
	}
	return ret;
}

先简单说一下一个正常的式子转后缀表达式是什么逻辑,先说没有括号的情况下

给一个string,从左向右开始:先创建一个栈

1.如果遇到非运算符直接写入到最终结果中

2.如果遇到运算符,(1).如果栈为空或此运算符比栈顶运算符的优先级高,那么就入栈;(2).如果优先级相等或低,那么栈顶元素出栈,放到最终结果,继续仍然用此运算符进行下一轮判断

一直循环,直到string结束,最后把栈中的都移入到最终结果

如果有括号,将括起来的部分进行函数递归,重复上述过程,把递归完之后的结果加入到最终结果中

层序遍历肯定是要用到队列的,这个题的返回值告诉我们要一层一层的给到vector中,这就要求我们记录下每一层的节点个数才可以

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> ret;
        if (root == nullptr)
            return ret;
        queue<TreeNode*> qu;
        qu.push(root);
        int levelsize = qu.size();
     while(!qu.empty()){
         vector<int>f;
         while(levelsize--){
             TreeNode* tmp=qu.front();
             qu.pop();
             f.push_back(tmp->val);
             if(tmp->left!=nullptr)qu.push(tmp->left);
             if(tmp->right!=nullptr)qu.push(tmp->right);
         }
         ret.push_back(f);
         levelsize=qu.size();
     }
     return ret;
    }
};

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

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

相关文章

嘿!AI 编码新玩法上线!

随着 AI 智能浪潮到来&#xff0c;AI 编码助手成为越来越多开发者的必备工具&#xff0c;将开发者从繁重的编码工作中解放出来&#xff0c;极大地提高了编程效率&#xff0c;帮助开发者实现更快、更好的代码编写。 通义灵码正是这样一款基于阿里云通义代码大模型打造的智能编码…

ReorderData - 优化阅读笔记

主要实现文件: bolt/lib/Passes/ReorderData.cpp 支持 X86/Arm 测试用例&#xff1a; bolt/test/reorder-data-writable-ptload.c int a1,a2,a3,a4; // 待补充默认关闭&#xff0c;开启选项&#xff1a; # 指定要重排的数据段 --reorder-data<section1,section2,section3…

【ArcGIS】栅格数据进行标准化(归一化)处理

栅格数据进行标准化&#xff08;归一化&#xff09;处理 方法1&#xff1a;栅格计算器方法2&#xff1a;模糊分析参考 栅格数据进行标准化(归一化)处理 方法1&#xff1a;栅格计算器 栅格计算器&#xff08;Raster Calculator&#xff09; 方法2&#xff1a;模糊分析 空间…

Spring Boot Starter 与自动装配(Boot 3.0版本)

Spring Boot Starter 与自动装配 1、Starter Starter可以理解为Spring Boot中的一站式集成启动器&#xff0c;它包含了一系列可以集成到应用中的依赖项&#xff08;dependencies&#xff09;&#xff0c;可以快速一站式集成Spring组件及其他框架&#xff0c;而不需要到处找示…

CAP告诉你系统没法做到完美,只能做到权衡和适当

一、CAP介绍 CAP原理&#xff0c;全称为Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;和Partition tolerance&#xff08;分区容错性&#xff09;&#xff0c;是分布式系统设计中的基本原理。它强调了在设计分布式系统时&#xff0c…

【深度学习笔记】优化算法——学习率调度器

学习率调度器 &#x1f3f7;sec_scheduler 到目前为止&#xff0c;我们主要关注如何更新权重向量的优化算法&#xff0c;而不是它们的更新速率。 然而&#xff0c;调整学习率通常与实际算法同样重要&#xff0c;有如下几方面需要考虑&#xff1a; 首先&#xff0c;学习率的大…

Verovio简介及在Windows10和Ubuntu 22.04上编译过程

Verovio是一个快速、便携、轻量级的开源库&#xff0c;用于将音乐编码倡议(Music Encoding Initiative(MEI))数字乐谱雕刻到SVG图像中。Verovio还包含即时转换器(on-the-fly converters)用于渲染Plaine & Easie Code、Humdrum、Musedata、MusicXML、EsAC和ABC数字乐谱。源代…

SSL证书:构建网络安全的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C++容器适配器stack、queue、priority_queue

文章目录 C容器适配器stack、queue、priority_queue1、stack1.1、stack的介绍1.2、stack的使用1.3、stack的模拟实现 2、queue2.1、queue的介绍2.2、queue的使用2.3、queue的模拟实现 3、priority_queue3.1、priority_queue的介绍3.2、priority_queue的使用3.3、仿函数3.4、pri…

如何使用Everything+cpolar实现公网远程搜索下载内网储存文件资料

文章目录 前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库&#xff0c;我们需要两个软件的支持&#xff0c;分别是cpolar&#xff08;用于搭建内网穿透数据隧道…

架构面试题汇总:mysql全解析(六)

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! MySQL面试题涵盖了索引优化、事务管理、并发控制以及存储格式等核心领域&#xff0c;旨在评估应聘者对数据库性能优化和数据一致性…

软件介绍-知网研学

知网研学 基本功能 功能特色&#xff1a; 1.高效检索和管理期刊论文、博硕士论文、会议论文、报纸、年鉴、网页内容等各类资源 2.已有题录与CNKI题录自动匹配&#xff0c;可一键更新&#xff0c;完善题录信息 3.阅读中可随手记录学习中的想法&#xff1b;对学科名词可随时查…

Dgraph 入门教程三《linux本地部署》

上一章中&#xff0c;我们用的官方的Clound操作的&#xff0c;怎么在本地部署一套Dgraph呢。这一章将做详细介绍。安装有好几种方式&#xff0c;最简单的就是联网部署。因为项目需要&#xff0c;这里先不介绍和测试线上部署了&#xff0c;只介绍离线部署。 1、下载安装包 Rel…

微信小程序仿QQ头像轮播效果

1、效果图 2、效果流程分析 1、第1个头像大小从1到0缩小的同时&#xff0c;第2个头像左移 2、上面动画结束后&#xff0c;延迟50ms&#xff0c;第3个头像从0到1放大 3、把头像列表顺序前移一位&#xff0c;并重置轮播状态&#xff0c;以此达到一个循环。然后继续第一个步骤 …

Stable Diffusion 详解

整体目标 文本生成图片&#xff1b;文本图片生成图片 网络结构 CLIP的文本编码器和图片生成器组成图像生成器&#xff0c;输入是噪声经过UNet得到图像特征&#xff0c;最后解码得到图像 前向扩散 模型直接预测图片难度比较大&#xff0c;所有让模型预测噪音然后输入-噪音…

Everything:文件查找工具,一搜即得

名人说&#xff1a;东边日出西边雨&#xff0c;道是无晴却有晴。——刘禹锡 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍①Everything②核心功能③原理 二、下载安装①下载②安装 三、使用方法①文…

TRON Builder Tour 丹佛站活动获美联社等外媒高度评价

近日,波场TRON亮相ETH Denver大会并在期间成功举办TRON Builder Tour丹佛站活动,引发海外媒体热议。美联社、费加罗报、Cointelegraph等国际主流媒体及加密行业权威媒体均对此给予了高度评价,认为波场TRON在参会期间的表现及TRON Builder Tour活动的举办都展现了其坚定不移推动…

【大厂AI课学习笔记NO.74】人工智能产业技术架构

包括基础层、技术层和应用层。 人工智能的产业技术架构是一个多层次、多维度的复杂系统&#xff0c;它涵盖了从基础硬件和软件设施到高级算法和应用技术的全过程。这个架构通常可以分为三个主要层次&#xff1a;基础层、技术层和应用层。下面我将详细论述这三个层次及其细分内…

代码背后的女性:突破性别壁垒的技术先驱

个人主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《程序人生》 引言 在计算机科学的历史长河中&#xff0c;有许多杰出的女性为这个领域的发展做出了重要贡献。她们不仅在技术上取得了卓越成就&#xff0c;还打破了性别壁垒&#xff0c;为后来的女性树立了榜样。今…

scrcpy远程投屏控制Android

下载 下载后解压压缩包scrcpy-win64-v2.4.zip scrcpy连接手机 1. 有线连接 - 手机开启开发者选项&#xff0c;并开启USB调试&#xff0c;连接电脑&#xff0c;华为手机示例解压scrcpy&#xff0c;在scrcpy目录下打开终端&#xff0c;&#xff08;或添加scrcpy路径为环境变…