c++中的stack和dequeue解析

 更新时间:2023年05月04日 15:48:41   作者:叶超凡  
这篇文章主要介绍了c++中的stack和dequeue介绍,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

stack介绍

首先stack是一个类这个类是专门用来存数据,并且这个类是一个模板类,所以我们可以使用这个stack来存储各种各样的数据,但是这个类在存储数据的时候得遵循LIFO规则也就是后进先出原则:后进入stack的数据会先出stack,我们把最后进入stack对象的数据称为栈顶元素,把最先进入stack对象的数据称为栈底元素,下面是这个类的英文介绍:

stack的定义

我们来看看stack的构造函数:

库中的stack函数只提供了一种形式,并且这种形式的参数只有一个还提供了缺省值,那么我们在使用这个类的时候就不要管这个参数直接使用缺省值即可,比如下面的代码:

#include<iostream>
#include<stack>
using namespace std;
int main()
{
	stack<int> s1;
	return 0;
}

这样我们就创建了一个空类。

stack的数据插入

在stack中插入数据只能用到push函数:

这个函数有一个参数,并且该参数是value_type类型,那么这个类型的意思是:模板中第一个参数的类型

也就是stack在显示初始化的时候我们给的那个类型,那么该函数的使用代码如下:

#include<iostream>
#include<stack>
using namespace std;
int main()
{
	stack<int> s1;
	s1.push(1);
	s1.push(2);
	s1.push(3);
	s1.push(4);
	return 0;
}

我们可以通过调试看到这里的s1中确实有数据1 2 3 4 :

stack中数据的个数

这个函数就是显示stack对象中含有数据的个数

比如下面的代码:

int main()
{
	stack<int> s1;
	s1.push(1);
	s1.push(2);
	s1.push(3);
	s1.push(4);
	size_t _size = s1.size();
	cout << "对象中还有的个数为:" << _size << endl;
	return 0;
}

这段代码的运行结果为:

stack数据删除

在stack当中不存在头删尾删和任意位置的删除,只有一个pop函数来删除数据最后进入stack对象的数据,也就是栈顶元素:

比如说下面的代码:

int main()
{
	stack<int> s1;
	s1.push(1);
	s1.push(2);
	s1.push(3);
	s1.push(4);
	size_t _size = s1.size();
	cout << "对象中还有的个数为:" << _size << endl;
	s1.pop();
	return 0;
}

我们通过调试可以看到在pop函数执行之前对象s1中的内容为:

当我们执行完这里的pop函数之后,由于元素4是最后一个进入stack对象的,所以它是栈顶元素,那么在执行完pop函数之后该元素就会被删除,我们来看看调试的结果:

那么这就是pop函数的作用。

stack中数据的查看

在stack当中没有迭代器,范围for和操作符[ ]重载这些功能,因为stack遵守后进先出的LIFO规则,所以我们这里只能通过top函数来查看stack对象中的栈顶元素的内容,

当我们想看栈顶的后一个元素的时候,就只能将栈顶的元素删除再调用top函数来进行查看,比如说下面的代码:

int main()
{
	stack<int> s1;
	s1.push(1);
	s1.push(2);
	s1.push(3);
	s1.push(4);
	size_t _size = s1.size();
	cout << "对象中还有的个数为:" << _size << endl;
	cout << "对象中栈顶的元素为:" << s1.top() << endl;
	s1.pop();
	_size = s1.size();
	cout << "对象中还有的个数为:" << _size << endl;
	cout << "现在栈顶的元素为:" << s1.top() << endl;
	return 0;
}

这段代码的运行结果如下:

并且我们还可以通过top函数来修改栈顶元素的内容,比如说下面的代码:

int main()
{
	stack<int>s1;
	s1.push(1);
	s1.push(2);
	s1.push(3);
	s1.push(4);
	cout << "修改前栈顶的元素为:" << s1.top() << endl;
	s1.top() = 10;
	cout << "修改后栈顶的元素为:" << s1.top() << endl;
}

这段代码的运行结果如下:

判断stack对象是否为空

当我们想看看stack对象是否为空的时候就可以用到empty函数,这个函数的功能就是检查对象的数据是否为空,如果为空的话这个函数就会返回true,如果不为空的话这个函数就会返回flase,该函数的介绍如下:

这里就不用演示了。

stack对象的数据交换

stack也提供了,swap函数其作用就是将两个stack对象的数据进行交换,该函数的介绍如下:

我们可以看看下面的代码:

int main()
{
	stack<int> s1;
	s1.push(1);
	s1.push(2);
	s1.push(3);
	s1.push(4);
	stack<int> s2;
	s2.push(5);
	s2.push(6);
	s2.push(7);
	s2.push(8);
	s1.swap(s2);
	return 0;
}

在执行swap函数之前两个对象的内容如下:

执行完swap函数之后两个对象的内容为:

那么以上就是stack库中的所有基本内容。

queue的介绍

队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

queue的定义

这个对象的构造函数也只有一个参数,并且这个参数也是提供了缺省参数,我们使用的时候可以不用管,我们使用的时候直接创建一个空队列就行:

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	queue<int> q1;
	return 0;
}

queue的数据插入

通过这个函数,我们可以往指定队列对象中插入数据,那么这里的参数类型得和队列的数据相同,我们可以看卡下面的代码:

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	queue<int> q1;
	q1.push(1);
	q1.push(2);
	q1.push(3);
	q1.push(4);
	return 0;
}

我们创建队列的时候显示初始化为int类型,那么我们使用push函数的时候也得传递int类型的数据,那么我们这里就可以通过调试来看到这个对象的中内容:

front

这个函数的作用就是返回队列头部的值,并且我们可以通过这个函数来修改队列头部的值,比如说下面的代码:

using namespace std;
int main()
{
	queue<int> q1;
	q1.push(1);
	q1.push(2);
	q1.push(3);
	q1.push(4);
	cout <<"front 指向的元素为:" << q1.front() << endl;
	q1.front() = 10;
	cout << "front 指向的元素为:" << q1.front() << endl;
	return 0;
}

这段代码的运行结果如下:

back

这个函数的作用与front函数相反,这个函数就是返回队列尾部的值并且同样可以对其进行修改,比如说下面的代码:

int main()
{
	queue<int> q1;
	q1.push(1);
	q1.push(2);
	q1.push(3);
	q1.push(4);
	cout << "back 指向的元素为:" << q1.back() << endl;
	q1.back() = 10;
	cout << "back 指向的元素为:" << q1.back() << endl;
	return 0;
}

queue的元素个数

size函数的作用就是返回队列中元素的个数,比如说下面的代码:

int main()
{
	queue<int> q1;
	q1.push(1);
	q1.push(2);
	q1.push(3);
	q1.push(4);
	cout << "q1的元素个数为:" << q1.size() << endl;
	q1.push(5);
	cout << "q1的元素个数为:" << q1.size() << endl;
	return 0;
}

这段代码的运行结果如下:

queue中元素的删除

在队列中删除元素得用到pop函数,这个函数可以将队列中队头的数据进行删除,比如说下面的代码:

int main()
{
	queue<int> q1;
	q1.push(1);
	q1.push(2);
	q1.push(3);
	q1.push(4);
	cout << "q1的元素个数为:" << q1.size() << endl;
	q1.pop();
	cout << "q1的元素个数为:" << q1.size() << endl;
	return 0;
}

这段代码的运行结果如下:

empty

当我们想看看queue对象是否为空的时候就可以用到empty函数,这个函数的功能就是检查对象的内容是否为空,如果为空的话这个函数就会返回true,如果不为空的话这个函数就会返回flase。

queue的数据交换

如果我们想将两个queue对象的数据进行交换的话,我们这里就可以使用swap函数,这里为了防止使用者用错了方法,库中还提供了另外一种使用的形式:

我们来看看下面的代码:

int main()
{
	queue<int> q1;
	q1.push(1);
	q1.push(2);
	q1.push(3);
	q1.push(4);
	queue<int> q2;
	q2.push(5);
	q2.push(6);
	q2.push(7);
	q2.push(8);
	q1.swap(q2);
	swap(q1, q2);
	return 0;
}

我们可以通过调试来看到在swap函数执行之前两个对象的内容为:

执行了第一个swap函数之后,两个对象的内容进行了交换:

当我们再执行另一种swap函数之后对象的数据如下:

那么这就是swap函数的作用。

到此这篇关于c++中的stack和dequeue介绍的文章就介绍到这了,更多相关c++ stack和dequeue内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenCV透视变换应用之书本视图矫正+广告屏幕切换

    OpenCV透视变换应用之书本视图矫正+广告屏幕切换

    透视变换是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面绕迹线旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。本文将为大家介绍两个OpenCV透视变换应用,需要的可以参考一下
    2022-08-08
  • C语言全面细致精讲操作符的使用

    C语言全面细致精讲操作符的使用

    C 语言提供了丰富的操作符,有:算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符等。接下了让我们详细了解掌握它
    2022-05-05
  • Qt计时器使用方法详解

    Qt计时器使用方法详解

    这篇文章为大家详细主要介绍了Qt计时器的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++的头文件和实现文件详解

    C++的头文件和实现文件详解

    这篇文章主要介绍了C++的头文件和实现文件详解的相关资料,需要的朋友可以参考下
    2015-01-01
  • C++简单集合类的实现方法

    C++简单集合类的实现方法

    如何使用C++实现一个简单的集合类,这篇文章主要介绍了C++简单集合类的实现方法,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Qt数据库应用之超级自定义委托

    Qt数据库应用之超级自定义委托

    Qt中需要用到自定义委托的情形很多,比如提供下拉框选择,进度条展示下载进度啥的,默认的单元格是没有这些效果的,需要自己单独用委托的形式来展示。本文将为大家介绍Qt中如何进行超级自定义委托,需要的可以参考一下
    2022-03-03
  • 使用C语言实现本地socke通讯的方法

    使用C语言实现本地socke通讯的方法

    这篇文章主要介绍了 使用C语言实现本地socke通讯,代码分为服务器代码和客户端代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • VC MFC非模态对话框的实现方法

    VC MFC非模态对话框的实现方法

    这篇文章主要介绍了VC MFC非模态对话框的实现方法,有助于读者加深对于模态对话框与非模态对话框的理解与运用,需要的朋友可以参考下
    2014-07-07
  • C语言动态内存的分配实例详解

    C语言动态内存的分配实例详解

    动态内存管理同时还具有一个优点,当程序在具有更多内存的系统上需要处理更多数据时,不需要重写程序,下面这篇文章主要给大家介绍了关于C语言动态内存分配的相关资料,需要的朋友可以参考下
    2022-06-06
  • C语言函数的基本使用和递归小结

    C语言函数的基本使用和递归小结

    这篇文章主要介绍了C语言函数的基本使用和递归小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论