首页 > 其他分享 >彻底搞定栈和队列

彻底搞定栈和队列

时间:2024-02-14 13:55:05浏览次数:23  
标签:搞定 彻底 队列 栈顶 int 数组 数据结构 stack

栈和队列都是C++中的一种线性数据结构,这一篇博客,我们就来学习学习关于这两个数据结构的知识

什么是栈

栈(Stack)是一种后进先出(Last In First Out)的线性数据结构,这种数据结构简称为LIFO表,由于其特殊性,这种数据结构经常被用于关于括号匹配以及字符串解码等问题,当然这种题目可以出的很简单,也可以出的很难,这里建议大家先学习数组模拟这种方法,因为这种方法可以让学习stack容器时更加快速

实现方法1:数组模拟

用数组模拟栈其实很简单,只要你记得关于数组的知识就可以了,来看一看实例代码与讲解:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4; 
int main(){
	// a表示栈顶
	int stk[N], a = 0;  // 定义一个数组 stk(stack的缩写),定义栈顶为a 
	// 向栈顶插入一个数
	int x;
	cin >> x; 
	stk[a++] = x;  // a++表示将栈的大小增加1,并把x赋值给这个数 
	// 从栈顶弹出一个数
	a-- ;  // a--表示将栈的大小减少1,减少1就可以将栈顶元素出栈 
	// 栈顶的值
	stk[a]; // a不仅是栈的大小,也是栈顶元素的下标 
	// 判断栈是否为空,如果 a > 0,则表示不为空
	if(a > 0){
	    //代码 
	}
	return 0; 
} 

实现方法2:使用stack

stack是C++实现的栈容器,常见用法有:

#include<bits/stdc++.h>
using namespace std;
int main() {
	// 声明一个只能存储int类型的栈容器
	stack<int> s;
	// 入栈
	s.push(12); // 将12入栈 
	s.push(20); // 将20入栈 
	// 栈中元素个数
	cout << s.size() << '\n'; // 输出栈中元素个数 
	// 输出结果为2
	// 访问栈顶元素
	cout << s.top() << '\n'; // 输出栈顶元素 
	// 输出结果为20
	// 出栈
	s.pop(); // 将栈顶元素出栈 
	cout << s.top() << '\n'; // 输出栈顶元素 
	// 输出结果为12 
	return 0;
}

其实不只有栈可以实现这种操作,动态数组vector也是一种可以使用的方法,这里不过多赘述,感兴趣的读者可以自己去搜索一下

队列

什么是队列

队列(Queue)是一种先进先出(First In First Out)的线性数据结构,这种数据结构简称为FIFO表,与栈(Stack)不同,队列是在一端进行插入操作,在另一端进行删除操作

实现方法1:数组模拟

用数组模拟队列也比较简单,只不过相对于栈来说稍微有一些复杂:

using namespace std;
const int N = 1e4; 
int main(){
	// b表示队头,a表示队尾
	int q[N], b = 0, a = -1;
	// 向队尾插入一个数
	int x;
	cin >> x; 
	q[a++] = x;  // 这个其实相当于入栈,不过多赘述 
	// 从队头弹出一个数
	b++;  // 与栈不同的是这里是队头弹出,于是刚好与栈相反 
	// 队头的值
	q[b];  // 这个不用多说了吧 
	// 判断队列是否为空,如果 hh <= tt,则表示不为空
	if(b <= a){
		//代码 
	}
}

实现方法2:使用队列

这个我们类比栈来学习

#include<bits/stdc++.h>
using namespace std;
int main() {
    // 声明一个只能存储int类型的队列容器
    queue<int> q;
    // 入队列
    q.push(12); // 将12入队列 
    q.push(20); // 将20入队列 
    // 队列中元素个数
    cout << q.size() << '\n'; // 输出队列中元素个数 
    // 输出结果为2
    // 访问队首元素
    cout << q.front() << '\n'; // 输出队首元素 
    // 输出结果为12
    // 出队列
    q.pop(); // 将队首元素出队列 
    cout << q.front() << '\n'; // 输出队首元素 
    // 输出结果为20 
    return 0;
}

队列和栈一样是一种常用的数据结构,可以应用于很多场景。比如,可以使用队列来实现消息队列,用于处理异步任务。此外,队列还常用于广度优先搜索算法中,用于管理待访问的节点。队列可以通过使用数组、链表等不同的底层实现方式来实现,读者可以根据具体的需求选择合适的实现方式。

标签:搞定,彻底,队列,栈顶,int,数组,数据结构,stack
From: https://www.cnblogs.com/charzie-blog/p/18015171

相关文章

  • 彻底搞定++i与i++的区别
    i++与++i单独用时的效果是一模一样的,但是如果突然要你说他们俩的区别,你又能不能回答上来呢?这篇博文,我们就完全弄懂他们俩兄弟的区别!基本概念i++和++i要是单独使用的话效果是一样的,都是i=i+1,实验证明:i++代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){in......
  • P1886-单调队列【黄】
    一道普普通通的模版题,让我想起了此前做过的绿题P1725,于是运用相同的知识轻松切掉本题Code#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<cstdlib>#include<algorithm>#include<stack>#include<queue>#include......
  • 力扣 递归 迭代 栈 广度 队列 之 226. 翻转二叉树
    给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]栈/** *Definitionforabinarytreenode. *publicclassTreeNode......
  • 单调队列
    单调队列239.滑动窗口最大值int*maxSlidingWindow(int*nums,intnumsSize,intk,int*returnSize){*returnSize=numsSize-k+1;int*res=(int*)malloc(sizeof(int)*(*returnSize));//双端队列,从大到小排,记录在nums中的下标intdequeue[1......
  • 【Java 并发】【队列应用】【二】Tomcat的NioEndPoint中ConcurrentLinkedQueue 的使用
    1 前言这一节我们讲解Tomcat的NioEndPoint中ConcurrentLinkedQueue的使用。2  Tomcat的容器结构本节讲解apache-tomcat-7.0.32-src源码中ConcurrentLinkedQueue的使用。首先介绍Tomcat的容器结构以及NioEndPoint的作用,以便后面能够更加平滑地切入话题,如图11-4所示......
  • 【Java 并发】【队列应用】【一】ArrayBlockingQueue 的使用-Logback异步日志打印
    1 前言看了那么多Java提供的队列工具,那么我们这节开始看看哪些地方用到了这些队列哈。这一节我们讲解logback异步日志打印中ArrayBlockingQueue的使用。2  异步日志打印模型概述在高并发、高流量并且响应时间要求比较小的系统中同步打印日志已经满足不了需求了,这是因为......
  • 6个步骤搞定云原生应用监控和告警(建议收藏)
    云原生系统搭建完毕之后,要建立可观测性和告警,有利于了解整个系统的运行状况。基于Prometheus搭建的云原生监控和告警是业内常用解决方案,每个云原生参与者都需要了解。本文主要以springboot应用为例,讲解云原生应用监控和告警的实操,对于理论知识讲解不多。等朋友们把实操都理顺之后......
  • 栈和队列
    栈如同叠猫猫,而队列就像猫猫排队。两者分别代表着先入后出和先入先出的逻辑关系。「栈stack」是一种遵循先入后出的逻辑的线性数据结构。我们可以将栈类比为桌面上的一摞盘子,如果需要拿出底部的盘子,则需要先将上面的盘子依次取出。我们将盘子替换为各种类型的元素(如整数、字......
  • 详解golang实现一个带时效的环形队列
    1.需求mysql执行时间超过100ms以上打warn日志,但是一分钟以内这种warn日志超过10条就需要告警。所以需求就是获得一分钟以内mysql的warn的个数。2.分析为什么使用环形队列而不使用slice?因为队列长度固定,所以可以一开始就分配好空间,不用自动扩容,环形的目的就是不用改变数组的值,只用移......
  • [数据结构] 队列
    队列的基本概念队列(Queue),是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队,删除元素称为出队。其操作特性是先进先出队列的常见操作:函数名功能InitQueue(*Q)初始化队列,构造一个空队列QQueueEmpty(Q)判断队列空......