初级数据结构——栈题库(c++)

目录

  • 前言
    • 1.杭电oj——Bitset
    • 2.杭电oj——进制转换
    • [3.力扣——LCR 123. 图书整理 I](https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/description/)
    • [4.力扣——LCR 027. 回文链表](https://leetcode.cn/problems/aMhZSa/)
    • [5.力扣——1614. 括号的最大嵌套深度](https://leetcode.cn/problems/maximum-nesting-depth-of-the-parentheses/description/)
    • 6.力扣——20.有效的括号
    • [7.力扣——739. 每日温度](https://leetcode.cn/problems/daily-temperatures/description/)
    • [8.力扣——2487. 从链表中移除节点](https://leetcode.cn/problems/remove-nodes-from-linked-list/)
  • 结语

前言

在上一期作品 (蓝色字体可以点进去看上期作品) 我们对栈有了初步的了解,这期我们来进行实战,做一些栈相关的题。

在这里插入图片描述

1.杭电oj——Bitset

(蓝色字体点进去看原题)

#include<iostream>
#include<stdexcept>
#include<stack>
using namespace std;template<typename T>
class Stack {
private:struct Node{T data;Node* next;Node(T x):data(x),next(NULL){}};Node* head;int size;
public:Stack():size(0),head(NULL){}~Stack();void push(T x);T top() const;T pop();bool empty();int getSize();
};template<typename T>
Stack<T>::~Stack() {while (head) {Node* t = head;head = head->next;delete t;}
}template<typename T>
void Stack<T>::push(T x) {//插入操作用头插法,即头节点为栈顶Node* newNode = new Node(x);newNode->next = head;head = newNode;size++;
}template<typename T>
T Stack<T>::top() const {if (!head) {throw std::underflow_error("Stack is empty!");}return head->data;
}template<typename T>
T Stack<T>::pop() {if (!head) {throw std::underflow_error("Stack is empty!");}T result = head->data;Node* t = head;head = head->next;delete t;size--;return result;
}template<typename T>
int Stack<T>::getSize() {return size;
}template<typename T>
bool Stack<T>::empty() {return size == 0 ? 1 : 0;
}int main() {int n;while (cin >> n) {Stack<int>s;while (n) {s.push(n % 2);n /= 2;}while (!s.empty()) {int x = s.pop();cout << x;}cout << endl;}return 0;
}

2.杭电oj——进制转换

(蓝色字体点进去看原题)

#include<iostream>
#include<exception>
using namespace std;template<typename T>//定制栈里面的元素,就像vector一样
class Stack {
private:int size;//既为栈元素个数又为栈顶位置int capacity;T* data;void resize();
public:Stack():data(new T[capacity]),size(0),capacity(10){}//构造函数,申请类型为T容量为capacity的内存空间,相当于数组~Stack();void push(T x);T top() const;T pop();int getSize() const;bool empty() const;
};template<typename T>
void Stack<T>::resize() {//顺序栈扩容int newCapacity = 2 * capacity;T* newData = new T[newCapacity];for (int i = 0; i < size; i++) {newData[i] = data[i];}delete[]data;data = newData;capacity = newCapacity;
}template<typename T>
Stack<T>::~Stack() {delete[]data;
}template<typename T>
void Stack<T>::push(T x) {if (size == capacity) {resize();}data[size++] = x;
}template<typename T>
T Stack<T>::top() const {if (!size) {throw std::underflow_error("Stack is empty");//如果栈为空即为非法状态,抛出异常}return data[size - 1];//注意栈元素序号从零开始
}template<typename T>
T Stack<T>::pop(){if (!size) {throw std::underflow_error("Stack is empty");}return data[--size];
}template<typename T>
int Stack<T>::getSize() const {return size;
}template<typename T>
bool Stack<T>::empty() const {return size == 0 ? 1 : 0;
}int main() {int n,base;while (cin >> n >> base) {if (!n) {//如果进制数为0那么结果自然为零cout << 0 << endl;continue;}if (n < 0) {//如果是负数就输出个负号cout << "-";n = -n;}Stack<int>s;while (n) {s.push(n % base);n /= base;}while (!s.empty()) {int x = s.pop();if (x < 10)cout << x;//小于零就直接输出这个数else {printf("%c", 'A' + x - 10);//大于零就输出字符,记住这个转换公式'A'+x-10}}cout << endl;}return 0;
}

3.力扣——LCR 123. 图书整理 I

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:vector<int> reverseBookList(ListNode* head) {//这一题就是反转链表,也就是逆序输出链表stack<int> s;while(head){s.push(head->val);head=head->next;}vector<int>ans;while(!s.empty()){ans.push_back(s.top());s.pop();}return ans;}
};

4.力扣——LCR 027. 回文链表

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:bool isPalindrome(ListNode* head) {ListNode*curr=head;stack<int>s;while(curr){s.push(curr->val);curr=curr->next;}while(head){if(head->val!=s.top())return false;s.pop();head=head->next;}return true;}
};

5.力扣——1614. 括号的最大嵌套深度

class Solution {
public:int maxDepth(string s) {//思路:如果是(进栈在cnt++,如果是)出栈cnt--,每次用ret与cnt比较,就可以得到最大值stack<char>st;int cnt=0,ret=0;for(int i=0;i<s.size();i++){if(s[i]=='('){st.push(s[i]);cnt++;}if(s[i]==')'){st.pop();cnt--;}ret=max(ret,cnt);}return ret;}
};

6.力扣——20.有效的括号

class Solution {bool isLeft(char s){return s == '(' || s == '{'|| s == '[';}bool isMatch(char l, char r){return l == '(' && r == ')' ||l == '{' && r == '}' || l == '[' && r == ']';}public:bool isValid(string s) {stack<char> stk;for(int i=0;i<s.size();i++){if(isLeft(s[i])){//如果是左括号都入栈stk.push(s[i]);}else{if(stk.empty())return false;//如果不是左括号并且这时候栈为空就说明没有与之匹配的括号if(!isMatch(stk.top(), s[i]))return false;//如果不匹配就返回空stk.pop();}}if(!stk.empty())return false;//遍历完以后如果栈不为空那么就是说还有左括号没匹配return true;}
};

7.力扣——739. 每日温度

class Solution {
public:vector<int> dailyTemperatures(vector<int>& t) {vector<int>ans;//用于保存结果vector<int>stk;//这个vector当做栈用,用于记录t的位置for(int i=0;i<t.size();i++){ans.push_back(0);//给结果数组初始化为0}for(int i = 0; i < t.size(); i++){while(stk.size() && t[ stk.back() ] < t[i]){ans[ stk.back() ] = i - stk.back();stk.pop_back();}stk.push_back(i);//如果栈为空并且t[ stk.back() ] > t[i],就插入当前位置}return ans;}
};

8.力扣——2487. 从链表中移除节点

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeNodes(ListNode* head) {vector<ListNode*> s;//用vector当做栈使用,存储单调不减的结果链表ListNode* dummy = new ListNode(1000000,head);//利用这个虚拟头结点返回结果链表,赋值一个比链表所有值都大的数,dummy->next=headListNode*now = head;s.push_back(dummy);while(now){while(s.back()->val < now -> val){//如果遍历到当前数大于栈顶值,就弹栈,直到不大于为止s.pop_back();}s.push_back(now);now=now->next;}for(int i=0;i<s.size()-1;i++){s[i]->next=s[i+1];//改变栈元素节点的指向形成新链表,即为结果链表}s.back()->next=NULL;//尾结点下一个节点必然为空return dummy->next;//dummy就是结果链表}
};

结语

想必做过这个题库的帅哥对栈的理解与应用有了提升,那么对初级数据结构——栈的学习就告一段落,下个作品我会与大家深入对初级数据结构——队列学习。
在这里插入图片描述
想看更多内容可以关注我,看我作品,关注我让我们一起学习编程,希望大家能点赞关注支持一下,让我有持续更新的动力,谢谢大家
在这里插入图片描述

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

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

相关文章

数字化转型企业架构设计手册(交付版),企业数字化转型建设思路、本质、数字化架构、数字化规划蓝图(PPT原件获取)

1、企业架构现状分析 2、企业架构内容框架 3、企业架构设计方法 3.1 、业务架构设计方法 3.2 、数据架构设计方法 3.3 、应用架构设计方法 3.4 、技术架构设计方法 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&…

⾃动化运维利器Ansible-基础

Ansible基础 一、工作原理二、快速入门2.1 测试所有资产的网络连通性2.2 发布文件到被管理节点(资产) 三、资产(被管理节点)3.1 静态资产3.1.1 自定义资产3.1.2 自定义资产的使用3.1.3 资产选择器 四、Ansible Ad-Hoc 命令4.1 模块类型4.1.1 command & shell 模块4.1.2 cop…

鸿蒙NEXT自定义组件:太极Loading

【引言】&#xff08;完整代码在最后面&#xff09; 本文将介绍如何在鸿蒙NEXT中创建一个自定义的“太极Loading”组件&#xff0c;为你的应用增添独特的视觉效果。 【环境准备】 电脑系统&#xff1a;windows 10 开发工具&#xff1a;DevEco Studio NEXT Beta1 Build Vers…

AVL树了解并简单实现

这篇文章默认知道二叉搜索树&#xff0c;如果了解并不多可以先看看二叉搜索树了解和实现-CSDN博客 目录 1.AVL树概念 2.AVL树节点定义 3.AVL树的插入&#xff08;重点&#xff09; 3.1AVL树 3.2AVL树的旋转 3.3AVL树插入代码 4.AVL树的验证 5.AVL树的删除 6.AVL树的性能…

【MySQL】索引原理及操作

目录 索引原理 初识索引 磁盘原理 磁盘与系统之间的关系 MySQL、系统、磁盘之间的关系 理解索引 页目录 页目录设计的数据结构问题 聚簇索引与非聚簇索引 遗留问题 索引操作 创建索引 查询索引 删除索引 其他索引概念与操作 索引原理 索引&#xff08;I…

代码随想录算法训练营第三十一天| 56. 合并区间 、738.单调递增的数字 。c++转java

56. 合并区间 class Solution {public int[][] merge(int[][] intervals) {//对区间按照右边界排序Arrays.sort(intervals,(a,b) -> Integer.compare(a[0],b[0]));List<int[]> p new LinkedList<>();int l intervals[0][0],r intervals[0][1];for(int i 1;i…

厦大南洋理工最新开源,一种面向户外场景的特征-几何一致性无监督点云配准方法

导读 本文提出了INTEGER&#xff0c;一种面向户外点云数据的无监督配准方法&#xff0c;通过整合高层上下文和低层几何特征信息来生成更可靠的伪标签。该方法基于教师-学生框架&#xff0c;创新性地引入特征-几何一致性挖掘&#xff08;FGCM&#xff09;模块以提高伪标签的准确…

模型运行速度笔记: s/epoch VS s/iter

1 概念介绍 在模型训练中&#xff1a; s/epoch 表示每个epoch所需的秒数&#xff0c;即完成一轮完整数据集训练的时间。s/iter 表示每个iteration&#xff08;迭代&#xff09;所需的秒数&#xff0c;即处理一个batch的时间。 它们的关系是&#xff1a; 2 举例 比如我tra…

k8s 中传递参数给docker容器

文章目录 docker启动时传递参数使用k8s env传递完全覆盖 ENTRYPOINT 和 CMD 在 Kubernetes 中&#xff0c;可以通过多种方式将参数传递给 Dockerfile 或其运行的容器&#xff0c;常见的方式包括使用环境变量、命令行参数、配置文件等。以下是一些常用的方法&#xff1a; docker…

Map Set

在学习TreeMap和TreeSet之前需要先学习有关搜索树的相关知识以及接口Map和Set。 1. 搜索树 1.1 概念 二叉搜索树又称二叉排序树&#xff0c;其特点是&#xff0c;该节点的左边都比其小&#xff0c;右边都比其大&#xff0c;每一棵子树都必须满足这个条件。如下图所示例子。2…

Android OpenGLES2.0开发(八):Camera预览

严以律己&#xff0c;宽以待人 引言 终于到该章节了&#xff0c;还记得Android OpenGLES2.0开发&#xff08;一&#xff09;&#xff1a;艰难的开始章节说的吗&#xff1f;写这个系列的初衷就是因为每次用到GLSurfaceViewCamera预览时&#xff0c;总是CtrlC、CtrlV从来没有研究…

基础 IO

目录 一、基本共识 二、复习C语言中的文件操作 三、与文件操作有关的系统调用接口 1. open 与 close 1.1 umask 2. write 3. read 四、如何理解文件 1. 文件描述符 fd 2. 文件fd分配规则 3. 重定向的引入 4. 重定向的本质 5. dup2 6. 理解 >、>>、…

ThriveX 博客管理系统前后端项目部署教程

前端 前端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Blog 控制端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Admin Vercel 首先以 Vercel 进行部署&#xff0c;两种方式部署都是一样的&#xff0c;我们以前端项目进行演示 首先我们先…

[含文档+PPT+源码等]精品基于springboot实现的原生Andriod手机使用管理软件

软件开发环境及开发工具&#xff1a; 数据库管理工具&#xff1a;phpstudy/Navicat或者phpstudy/sqlyog 开发工具&#xff1a;Android Studio 后台管理系统涉及技术&#xff1a; 后台使用框架&#xff1a;Springboot 前端使用技术&#xff1a;Vue,HTML5,CSS3、JavaScript等…

华为三层交换机禁止VLAN间通讯(两种解决方案)

在日常办公中&#xff0c;有时会禁止内网中各个部门间的访问&#xff0c;例如&#xff1a; ①访客不能访问内网任何终端及服务器 ②财务部门不能被其他部门访问 实验环境&#xff1a;华为Ensp模拟器 内网架构&#xff1a;三层网络 环境说明&#xff1a;三层交换机承载着网…

为以人工智能为中心的工作负载重新设计的全局控制台

MinIO 控制台多年来一直是一个不断发展的产品。每次学习时&#xff0c;我们都会思考如何改进交互框架中这个非常重要的部分。首先是控制台&#xff0c;它在推出后的一年内就被广泛采用。更具体地说&#xff0c;超过 10K 个组织。接下来是企业控制台。这从对象存储与其 GUI 之间…

stm32在linux环境下的开发与调试

环境安装 注&#xff1a;文末提供一键脚本 下载安装stm32cubeclt 下载地址为&#xff1a;https://www.st.com/en/development-tools/stm32cubeclt.html 选择 linux版本下载安装 安装好后默认在家目录st下 > $ ls ~/st/stm32cubeclt_1.16.0 …

【leetcode】N皇后 回溯法c++

目录 51.N皇后 52.N皇后II 51.N皇后 51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间…

GESP4级考试语法知识(贪心算法(六))

寻找平面上的极大点代码 #include<iostream> #include<algorithm> using namespace std; struct node {int x,y; }a[101]; bool vis[101]; bool cmp(node A,node B) {if(A.x!B.x) return A.x<B.x;return A.y<B.y; } int main() {int n;cin>>n;for(int…

如何构建高效的知识库系统?实现智能信息管理

在当今信息化迅速发展的时代&#xff0c;企业和组织面临着海量信息的挑战。如何有效地管理这些信息&#xff0c;使其安全、易于访问&#xff0c;并且能够快速响应用户的需求&#xff0c;成为了智慧管理的核心。而知识库系统(Knowledge Base System)正是为了解决这一问题而应运而…