代码随想录笔记--栈与队列篇

目录

1--用栈实现队列

2--用队列实现栈

3--有效的括号

4--删除字符串中的所有相邻重复项

5--逆波兰表达式求值

6--滑动窗口的最大值

7--前k个高频元素


1--用栈实现队列

利用两个栈,一个是输入栈,另一个是输出栈

#include <iostream>
#include <stack>class MyQueue {
public:MyQueue() {}void push(int x) {in_stk.push(x);}int pop() {if(out_stk.empty()){while(!in_stk.empty()){out_stk.push(in_stk.top());in_stk.pop();}}int tmp = out_stk.top();out_stk.pop();return tmp;}int peek() {if(out_stk.empty()){while(!in_stk.empty()){out_stk.push(in_stk.top());in_stk.pop();}}return out_stk.top();}bool empty() {if(out_stk.empty() && in_stk.empty()) return true;else return false;}
private:std::stack<int> in_stk, out_stk;
};int main(int argc, char* argv[]){MyQueue Queue;Queue.push(1);Queue.push(2);Queue.push(3);std::cout << Queue.pop() << std::endl;std::cout << Queue.peek() << std::endl;return 0;
}

2--用队列实现栈

主要思路:

        弹出栈顶元素时,需要将队列前 size - 1 个元素先弹出再重新加入到队列中;

#include <iostream>
#include <queue>class MyStack {
public:MyStack() {}void push(int x) {q.push(x);}int pop() {int size = q.size();for(int i = 1; i <= size - 1; i++){q.push(q.front());q.pop();}int tmp = q.front();q.pop();return tmp;}int top() {int size = q.size();for(int i = 1; i <= size - 1; i++){q.push(q.front());q.pop();}int tmp = q.front();q.pop();q.push(tmp);return tmp;}bool empty() {return q.empty();}
private:std::queue<int> q;
};int main(int argc, char* argv[]){MyStack stk;stk.push(1);stk.push(2);stk.push(3);std::cout << stk.pop() << std::endl;std::cout << stk.top() << std::endl;return 0;
}

3--有效的括号

主要思路:

        基于栈,遇到左括号,入栈对应的右括号。遇到右括号,判断当前栈顶元素是否与右括号相等,相等则表示之前曾遇到对应的左括号,表明匹配成功并弹出栈顶元素,否则返回 false;

        最后判断栈是否为空,即是否有未匹配的左括号;

#include <iostream>
#include <stack>
#include <string>class Solution {
public:bool isValid(std::string s) {std::stack<char> stk;for(int i = 0; i < s.length(); i++){if(s[i] == '(') stk.push(')');else if(s[i] == '[') stk.push(']');else if(s[i] == '{') stk.push('}');else{if(stk.empty()) return false;else if(stk.top() != s[i]) return false;else stk.pop(); // 匹配}}return stk.empty();}
};int main(int argc, char* argv[]){std::string test = "()[]{}";Solution S1;bool res = S1.isValid(test);if(res) std::cout << "true" << std::endl;else std::cout << "false" << std::endl;return 0;
}

4--删除字符串中的所有相邻重复项

主要思路:

        基于栈,遍历字符串,判断当前字符与栈顶元素是否相同,相同则弹出栈顶元素,否则入栈;

        最后遍历栈,将栈内的元素重构为字符串,需注意顺序;

#include <iostream>
#include <stack>
#include <string>class Solution {
public:std::string removeDuplicates(std::string s) {std::stack<char> stk;for(int i = 0; i < s.length(); i++){if(stk.empty() || stk.top() != s[i]){stk.push(s[i]);}else{ // s[i] == stk.top()stk.pop();}}std::string res;while(!stk.empty()){res = stk.top() + res;stk.pop();}return res;}
};int main(int argc, char* argv[]){std::string test = "abbaca";Solution S1;std::string res = S1.removeDuplicates(test);std::cout << res << std::endl;return 0;
}

5--逆波兰表达式求值

主要思路:

        基于栈,遍历字符串数组,当遇到数字时将数字压入栈中,当遇到运算符时,将栈顶的两个元素取出来进行运算,并将运算结果重新压入栈中;

        需注意运算顺序,即第二个出栈的 num2 作为运算符的左侧元素;

#include <iostream>
#include <vector>
#include <stack>
#include <string>class Solution {
public:int evalRPN(std::vector<std::string>& tokens) {std::stack<int> stk;for(int i = 0; i < tokens.size(); i++){if(tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/"){stk.push(std::stoi(tokens[i]));continue;}int num1 = stk.top();stk.pop();int num2 = stk.top();stk.pop();if(tokens[i] == "+"){  int num3 = num2 + num1;stk.push(num3);continue;}else if(tokens[i] == "-"){int num3 = num2 - num1;stk.push(num3);continue;}else if(tokens[i] == "*"){int num3 = num2 * num1;stk.push(num3);continue;                }else{int num3 = num2 / num1;stk.push(num3);continue;}}return stk.top();}
};int main(int argc, char* argv[]){// tokens = ["2","1","+","3","*"]std::vector<std::string> test = {"2", "1", "+", "3", "*"};Solution S1;int res = S1.evalRPN(test);std::cout << res << std::endl;return 0;
}

6--滑动窗口的最大值

主要思路:

        维护一个双端队列,队列里的元素存储的是可能成为最大值的元素,对于当前滑动窗口,其最大值为队头元素;

        当移动滑动窗口时,需要判断当前移出窗口的元素是否是队头元素,如果是则需先将队头元素弹出(因为该元素已经离开了滑动窗口,相当于失效);

        之前本题的解法是存储元素的索引(之前的解法),这样可以避免重复元素的出现;但现在本题的解法是存储元素,所以一个细节是需要避免错误移除重复元素的问题,具体可以推导例子:[-7,-8,7,5,7,1,6,0];

#include <iostream>
#include <vector>
#include <queue>class Solution {
public:std::vector<int> maxSlidingWindow(std::vector<int>& nums, int k) {std::deque<int> q; // 存储可能成为最大值的元素std::vector<int> res;// 初始化第一个滑动窗口for(int i = 0; i < k; i++){// 不能取等于号的原因是可能会出现相等的数,例如下例// [-7,-8,7,5,7,1,6,0] 出现了两个7,取=号会误弹出第2个7while(!q.empty() && q.back() < nums[i]){q.pop_back();}q.push_back(nums[i]);}res.push_back(q.front());// 遍历更新for(int i = k; i < nums.size(); i++){// 移除滑动窗口左边界的元素if(nums[i-k] == q.front()) q.pop_front();// 把不可能成为最大值的元素从队列中移出while(!q.empty() && q.back() < nums[i]){q.pop_back();}q.push_back(nums[i]);res.push_back(q.front()); // 记录当前滑动窗口的最大值}return res;}
};int main(int argc, char* argv[]){std::vector<int> test = {1, 3, -1, -3, 5, 3, 6, 7};int k = 3;Solution S1;std::vector<int> res = S1.maxSlidingWindow(test, k);for(auto v : res) std::cout << v << " ";std::cout << std::endl;return 0;
}

7--前k个高频元素

主要思路:

        维护一个优先队列(小顶堆),里面存储 k 个元素及其出现的次数;

#include <iostream>
#include <vector>
#include <map>
#include <queue>class Solution {
public:std::vector<int> topKFrequent(std::vector<int>& nums, int k) {std::map<int, int> m;for(int i = 0; i < nums.size(); i++){m[nums[i]] += 1;}// 小顶堆std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, mycompare> pri_q;for(auto it = m.begin(); it != m.end(); it++){pri_q.emplace(*it);if(pri_q.size() > k) pri_q.pop(); // 始终维护 k 个 pair 对}// 倒叙输出k个高频元素std::vector<int> res(pri_q.size(), 0);for(int i = pri_q.size() - 1; i>=0; i--){res[i] = pri_q.top().first;pri_q.pop();}return res;}class mycompare{public:bool operator()(std::pair<int, int>& item1, std::pair<int, int>& item2){return item1.second > item2.second;}};
};int main(int argc, char* argv[]){// nums = [1,1,1,2,2,3], k = 2std::vector<int> test = {1, 1, 1, 2, 2, 3};int k = 2;Solution S1;std::vector<int> res = S1.topKFrequent(test, k);for(auto item : res) std::cout << item << " ";std::cout << std::endl;return 0;
}

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

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

相关文章

NodeJS的简介以及下载和安装

本章节会带大家下载并安装NodeJs 以及简单的入门&#xff0c;配有超详细的图片&#xff0c;一步步带大家进行下载与安装 NodeJs简介关于前端与后端Node是什么&#xff1f;为什么要学习NodeNodeJS的优点&#xff1a; NodeJS的下载与安装NodeJS的下载&#xff1a; NodeJS的快速入…

剑指 Offer 49. 丑数(C++实现)

剑指 Offer 49. 丑数https://leetcode.cn/problems/chou-shu-lcof/ 对每个丑数 分别乘2、乘3、乘5 即可得到后续丑数 其中只需要对计算出来的丑数结果进行去重即可 int nthUglyNumber(int n) {// base caseif (n < 1){return -1;}if (n 1){return 1;}vector<int> res…

记1次前端性能优化之CPU使用率

碰到这样的一个问题&#xff0c;用户反馈页面的图表一直加载不出来&#xff0c;页面还卡死 打开链接页面&#xff0c;打开控制台 Network 看到有个请求一直pending&#xff0c;结合用户描述&#xff0c;页面一直loading,似乎验证了我的怀疑&#xff1a;后端迟迟没有相应。 但是…

LINQ详解(查询表达式)

什么是LINQ&#xff1f; LINQ(语言集成查询)是将查询功能直接集成到C#中。数据查询表示简单的字符串&#xff0c;在编译时不会进行类型检查和IntelliSense(代码补全辅助工具)支持。 在开发中&#xff0c;通常需要对不同类型的数据源了解不同的查询语句&#xff0c;如SQL数据库…

Redis项目实战——商户查询缓存

目录 为什么要用Redis实现商户查询缓存&#xff1f;用Redis实现商户查询缓存的基本思路&#xff1f;使用Redis缓存的问题及解决方法&#xff1f;一、如何保持数据库数据和Redis缓存数据的一致性&#xff1f;1 内存淘汰机制2 超时剔除机制3 主动更新机制&#xff08;胜&#xff…

sql:SQL优化知识点记录(七)

&#xff08;1&#xff09;索引优化5 &#xff08;2&#xff09;索引优化6 &#xff08;3&#xff09;索引优化7 查询*&#xff0c; 百分号加右边&#xff0c;否则索引会失效 没建立索引之前都是全表扫描 没建立索引 建立索引&#xff1a; 建立索引 id是主键&#xff0c;他也…

全新UI站长在线工具箱系统源码带后台开源版

该系统的全开源版本可供下载&#xff0c;并且支持暗黑模式。 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API&#xff0c;同时还自带免费API接口&#xff0c; 是一个多功能性工具程序&#xff0c;支持后台管理、上传插件、添加增减删功能。 环…

WPF实战项目十三(API篇):备忘录功能api接口、优化待办事项api接口

1、新建MenoDto.cs /// <summary>/// 备忘录传输实体/// </summary>public class MemoDto : BaseDto{private string title;/// <summary>/// 标题/// </summary>public string Title{get { return title; }set { title value; OnPropertyChanged();…

python爬虫-数据解析BeautifulSoup

1、基本简介 BeautifulSoup简称bs4,BeautifulSoup和lxml一样是一个html的解析器&#xff0c;主要功能也是解析和提取数据。 BeautifulSoup和lxml类似&#xff0c;既可以解析本地文件也可以响应服务器文件。 缺点&#xff1a;效率没有lxml的效率高 。 优点&#xff1a;接口设…

实现跨境电商测评和采退、LU卡、LU货最安全的系统方案

首先你要有一个稳定的测评环境系统&#xff0c;这个是做自养号退款、撸货、撸卡的基础。测评环境系统有很多&#xff0c;从早期的虚拟机&#xff0c;模拟机&#xff0c;云手机&#xff0c;VPS等等。这些系统方案先不说成本高&#xff0c;最重要的是成功率很低&#xff0c;所以一…

openGauss学习笔记-57 openGauss 高级特性-并行查询

文章目录 openGauss学习笔记-57 openGauss 高级特性-并行查询57.1 适用场景与限制57.2 资源对SMP性能的影响57.3 其他因素对SMP性能的影响57.4 配置步骤 openGauss学习笔记-57 openGauss 高级特性-并行查询 openGauss的SMP并行技术是一种利用计算机多核CPU架构来实现多线程并行…

Benchmarking Chinese Text Recognition: Datasets, Baselines| OCR 中文数据集【论文翻译】

基础信息如下 https://arxiv.org/pdf/2112.15093.pdfhttps://github.com/FudanVI/benchmarking-chinese-text-recognition Abstract 深度学习蓬勃发展的局面见证了近年来文本识别领域的迅速发展。然而&#xff0c;现有的文本识别方法主要针对英文文本。作为另一种广泛使用的语…

企业架构LNMP学习笔记3

服务器基本环境配置&#xff1a; 1、安装虚拟机&#xff0c;centos7.9 操作系统&#xff1b; 2、网络配置&#xff1b; 3、机器名FQDN设置&#xff1b; 4、DNS解析设置&#xff0c;本地hosts设置&#xff1b; 5、配置yum源环境&#xff1b; 6、vim安装配置&#xff1b; …

RealVNC配置自定义分辨率(AlmaLinux 8)

RealVNC 配置自定义分辨率&#xff08;AlmaLinux8&#xff09; 参考RealVNC官网 how to set up resolution https://help.realvnc.com/hc/en-us/articles/360016058212-How-do-I-adjust-the-screen-resolution-of-a-virtual-desktop-under-Linux-#standard-dummy-driver-0-2 …

Docker环境搭建Prometheus实验环境

环境&#xff1a; OS&#xff1a;Centos7 Docker: 20.10.9 - Community Centos部署Docker 【Kubernetes】Centos中安装Docker和Minikube_云服务器安装docker和minikube_DivingKitten的博客-CSDN博客 一、拉取Prometheus镜像 ## 拉取镜像 docker pull prom/prometheus ## 启动p…

今天使用python进行开发

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

OpenCV(十一):图像仿射变换

目录 1.图像仿射变换介绍 仿射变换&#xff1a; 仿射变换矩阵&#xff1a; 仿射变换公式&#xff1a; 2.仿射变换函数 仿射变换函数&#xff1a;warpAffine() 图像旋转&#xff1a;getRotationMatrix2D() 计算仿射变换矩阵&#xff1a;getAffineTransform() 3.demo 1.…

Java 枚举是什么?什么是枚举类?枚举类的用途?

目录 1. 什么是枚举&#xff1f; 2. 枚举类 3. 枚举类的用途 1. 什么是枚举&#xff1f; 我们可以从字面意思来理解&#xff0c;枚&#xff1a;一枚一枚的&#xff0c;举&#xff1a;举例&#xff0c;举出&#xff0c;将二者意思结合起来可以理解为一个一个的举出。 这样听…

浅谈城市轨道交通视频监控与AI视频智能分析解决方案

一、背景分析 地铁作为重要的公共场所交通枢纽&#xff0c;流动性非常高、人员大量聚集&#xff0c;轨道交通需要利用视频监控系统来实现全程、全方位的安全防范&#xff0c;这也是保证地铁行车组织和安全的重要手段。调度员和车站值班员通过系统监管列车运行、客流情况、变电…

ESLint 中的“ space-before-function-paren ”相关报错及其解决方案

ESLint 中的“ space-before-function-paren ”相关报错及其解决方案 出现的问题及其报错&#xff1a; 在 VScode 中&#xff0c;在使用带有 ESLint 工具的项目中&#xff0c;保存会发现报错&#xff0c;并且修改好代码格式后&#xff0c;保存会发现代码格式依然出现问题&…