C++:stack类(vector和list优缺点、deque)

目录

前言

数据结构

deque

vector和list的优缺点

push

pop

top

size

empty

完整代码


前言

stack类就是数据结构中的栈

C数据结构:栈-CSDN博客

stack类所拥有的函数相比与string、vector和list类都少很多,这是因为栈这个数据结构是后进先出的,它必须被有所限制,所以所能用的函数只需要那几个足矣

栈可以用顺序表来实现,也可以用链表来实现,我们只需要控制它先进先出的特性即可,用什么容器实现取决于个人

因为我们前面实现了vector和list类,所以再实现stack类就容易很多了,只需要复用vector和list容器内的函数即可

数据结构

cpp 复制代码
template<class T, class Container = std::deque<T>>
class stack
{
public:

private:
	Container _con;
};

这里的模板有两个,T是栈的类型,Container表示的是所需要使用哪个容器来实现这个栈

我们需要用这个Container里面的成员函数来复用从而轻松的实现这个栈

这里的Container默认是deque

deque

deque(双端队列)也是STL中的一个容器,它是vector和list的结合

vector和list的优缺点

vector优点:

  1. 随机访问效率高

  2. 在内存中连续存储,缓存命中率高

vector缺点:

  1. 插入和删除效率低

  2. 空间分配不灵活(利用率低)

list优点:

  1. 插入和删除效率高

  2. 空间利用率高

list缺点:

  1. 访问数据速度慢

  2. 缓存利用率低(空间不连续,缓存命中率低)

为什么说deque是vector和list的结合?

下面是deque的数据结构图片

deque有n个buffer缓冲区(个数取决于数据个数)

这个缓冲区比list的空间大,像是一个小型数组,这个数组由中控器控制

而中控器可以通过一个数组来存储一个个的指针,这些指针又指向一个个缓冲区,所以它能够控制每一个缓冲区

iterator迭代器的cur、first和last来控制缓冲区的数据,node则表示是哪一个缓冲区

deque总结:

  1. deque的头尾插入效率高

  2. 下标的随机访问效率也还可以

  3. 中间插入删除的效率很低(O(N))

push

cpp 复制代码
void push(const T& x)
{
	_con.push_back(x);
}

栈的push就是插入到最后的位置,所以只需要复用容器中的push_back函数即可

deque、vector和list都有这些函数,所以这三个容器都可以用来实现stack类

pop

cpp 复制代码
void pop()
{
	_con.pop_back();
}

栈的pop就是尾删,所以只需要复用pop_back函数即可

top

cpp 复制代码
const T& top() const
{
	return _con.back();
}

栈的top就是取尾部数据,返回back函数即可

size

cpp 复制代码
size_t size() const
{
	return _con.size();
}

栈的size就是取得栈的数据个数,返回容器的size函数即可

empty

cpp 复制代码
bool empty() const
{
	return _con.empty();
}

栈的empty就是判断栈是否为空,返回empty函数即可

只要上述的函数名哪个类中有,并且功能相同,就可以使用那个类来完成stack的实现

完整代码

cpp 复制代码
#pragma once

#include<iostream>
#include<deque>

namespace lyw
{
	template<class T, class Container = std::deque<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_back();
		}

		const T& top() const
		{
			return _con.back();
		}

		size_t size() const
		{
			return _con.size();
		}

		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

相关推荐
蜡笔小新星16 分钟前
Flask项目框架
开发语言·前端·经验分享·后端·python·学习·flask
cliff,17 分钟前
【python爬虫】酷狗音乐爬取
笔记·爬虫·python·学习
IT猿手17 分钟前
2025最新群智能优化算法:海市蜃楼搜索优化(Mirage Search Optimization, MSO)算法求解23个经典函数测试集,MATLAB
开发语言·人工智能·算法·机器学习·matlab·机器人
夏天的味道٥3 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
云上艺旅4 小时前
K8S学习之基础十八:k8s的灰度发布和金丝雀部署
学习·云原生·容器·kubernetes
IT、木易4 小时前
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。
开发语言·前端·javascript·ecmascript
Mr.NickJJ5 小时前
JavaScript系列06-深入理解 JavaScript 事件系统:从原生事件到 React 合成事件
开发语言·javascript·react.js
Dream it possible!5 小时前
LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)
c++·算法·leetcode
Archer1946 小时前
C语言——链表
c语言·开发语言·链表
My Li.6 小时前
c++的介绍
开发语言·c++