C++初阶作业 Stackqueue 作业题一

news/2024/11/28 20:46:43/

作者:@小萌新
专栏:@C++初阶
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:实现几道Stack和queue的作业题
在这里插入图片描述

Stack queue作业题

    • 最小栈问题
    • 栈的压入弹出序列
    • 逆波兰表达式问题
  • 总结

最小栈问题

它问题的题目描述是这样子的
在这里插入图片描述

什么意思呢? 用一句话解释下 就是设计一个栈

这个栈除了能够执行正常的操作之外我们还要可以随时的获取这个栈中的最小元素

那我们想想看我们的思路是什么?

是不是只要设计两个栈就好了?

一个栈正常的存放数据

一个栈比较下当前存放的数据是否比自己最小的数据小

如果小于自己最小的数据那就入这个数据 如果不小于自己最小的数据 那么就再入一次目前来说最小的数据

这道题的主要难点在于思路 思路解决了 后面的问题也就解决了

代码表示如下

class MinStack {
public:MinStack() {}void push(int val) {_stk.push(val);if (_stkmin.empty()){_stkmin.push(val);}else{if (_stkmin.top() > val){_stkmin.push(val);}else{_stkmin.push(_stkmin.top());}}}void pop() {_stk.pop();_stkmin.pop();}int top() {return _stk.top();}int getMin() {return _stkmin.top();}private:stack<int> _stk;stack<int> _stkmin;
};

在这里插入图片描述

栈的压入弹出序列

题目如下

在这里插入图片描述
这里的题目要求我们来设计一个算法 检验栈的插入弹出序列是否是有效的

也就是说 最后能否完全弹出所有的数据

那想想看 我们这个时候应该怎么做呢?

要设计一个算法去计算有点太难了是不是

那么我们可不可以直接使用一个栈来模拟这个过程呢?

如果模拟通过是不是就表示肯定能通过了啊

我们一开始可以设计两个指针

一个指针指向插入数据的数组

一个指针指向删除数据的数组

像这样

在这里插入图片描述

当我们的出栈序列不等于入栈序列的时候那就一直入栈

当我们的出栈序列等于入栈序列的时候呢 就开始出栈

原则是:出掉所有符合出栈序列的数

在这里插入图片描述
像是这种情况 就代表出掉了所有的可以出的序列了

所以我们这个时候就停止出栈

当5也入栈的时候

在这里插入图片描述
这个时候就是按照 5 3 2 1的顺序出栈了

那么我们的代码表示如下

class Solution {
public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {stack<int> st;int pushvi = 0;int popvi = 0;while(pushvi < pushV.size()){st.push(pushV[pushvi]);pushvi++;// 判断是否要删除while(!st.empty() && st.top() == popV[popvi]){st.pop();popvi++;}}// 最后判断下结束return popvi == popV.size(); }
};

运行结果如下

在这里插入图片描述

逆波兰表达式问题

题目如下

在这里插入图片描述

这里大家首先要理解逆波兰表达式究竟是什么?

大家可以上各类视频网站详细了解下 由于博客篇幅限制 这里

就只谈逆波兰表达式如何使用

它的原则其实很简单就只有两条

1 如果我们遍历到加减乘除四个字符串 那么我们就从栈中取出两个元素来分别作为左操作数和右边操作进行运算 之后还将它入栈

2 如果我们遍历到了数字字符串 那么我们就将它转化成整型数字 然后存放到栈当中去

那么对应的代码表示也就很简单了

long num1 = st.top(); st.pop();long num2 = st.top(); st.pop();if (x == "+") st.push(num2 + num1);if (x == "-") st.push(num2 - num1);if (x == "*") st.push(num2 * num1);if (x == "/") st.push(num2 / num1);
          st.push(stol(x));

最后在栈里面的数字其实就是我们要求的答案了

那么完整的代码表示如下

class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> st;for (auto x : tokens){if (x == "+" || x =="-" || x =="*" || x =="/"){long num1 = st.top(); st.pop();long num2 = st.top(); st.pop();if (x == "+") st.push(num2 + num1);if (x == "-") st.push(num2 - num1);if (x == "*") st.push(num2 * num1);if (x == "/") st.push(num2 / num1);}else{st.push(stol(x));}}return st.top();}
};

运行结果如下

在这里插入图片描述

总结

在这里插入图片描述
讲解了栈的三道题目 最小栈问题 栈的压入弹出序列 逆波兰表达式问题


http://www.ppmy.cn/news/3370.html

相关文章

volatile,wait,notify关键字

文章目录一、volatile关键字二、wait 和 notifywaitnotifynotifyAllwait 和 sleep 的区别顺序打印ABC一、volatile关键字 volatile关键字的存在是用来解决内存可见性问题的。 我在 &#xff1a;线程安全问题 这篇文章中介绍过内存可见性问题。 前面我们讨论内存可见性时说了,…

识破贷后资金归集——关联网络

近几年&#xff0c;金融机构为了扩大信贷规模&#xff0c;抢占市场份额&#xff0c;通过贷款将贷款发放给无法直接通过金融机构获得贷款的个人或者企业&#xff0c;但这也给金融机构带来了多重风险。 首先&#xff0c;我们来看下资金归集是什么。所谓资金归集&#xff0c;是银…

Mapbox 与 Babylon.js 可视化 glsl 特效篇(三十六)

我决定不从Babylonjs 基础来讲了 直接整合mapbox与babylonjs可视化来讲 我整合一个类库 后续不断更新中 npm i haibalai/mapbox-babylonjs 初始化mapbox-babylonjs 类库&#xff0c; map 是mapbox.gl 的map 对象 import { BabylonMapManager } from “haibalai/mapbox-baby…

为什么mac电脑识别不出来u盘?macbook识别不了u盘的解决办法

为什么mac电脑识别不出来u盘&#xff1f;关于U盘插入Mac电脑无反应的情况有很多种&#xff0c;是电脑无法识别U盘&#xff1f;电脑上面没有U盘的图标&#xff1f;还是插入后无法对U盘进行写入&#xff1f;针对不同的情况&#xff0c;解决的方法也是不一样的。现在&#xff0c;我…

STM32CUBEMX开发GD32F303(17)----内部Flash读写

概述 本章STM32CUBEMX配置STM32F103&#xff0c;并且在GD32F303中进行开发&#xff0c;同时通过开发板内进行验证。 本例程主要讲解如何对芯片自带Flash进行读写&#xff0c;用芯片内部Flash可以对一些需要断电保存的数据进行保存&#xff0c;无需加外部得存储芯片&#xff0c…

拓扑排序(数据结构之图的应用)

我们先搞清楚一个概念&#xff1a; 什么是出度与入度&#xff1f; 在有向图中&#xff0c;箭头是具有方向的&#xff0c;从一个顶点指向另一个顶点&#xff0c;这样一来&#xff0c;每个顶点被指向的箭头个数&#xff0c;就是它的入度。从这个顶点指出去的箭头个数&#xff0c…

WPF入门 第一篇 基础布局与简单样式

基础布局与简单样式 首先&#xff0c;创建WPF项目&#xff0c;在自动打开的MainWindow.xaml里面&#xff0c;找到Grid标签&#xff0c;并将它替换为&#xff1a; <Grid><Grid.RowDefinitions><RowDefinition></RowDefinition><RowDefinition>&…

Adobe Acrobat 图标异常的解决办法

今天使用 Adobe Acrobat 打开文件阅读时&#xff0c;发现底部任务栏的图标是这样的&#xff0c;如下图所示。 这可不是常见的 Adobe Acrobat 图标&#xff0c;肯定是哪里出了问题&#xff0c;于是我在电脑开始这里找到 Adobe Acrobat 的快捷方式&#xff0c;其图标也是这样的&…