> 文章列表 > C++语法(12)---- 模拟实现queue和stack

C++语法(12)---- 模拟实现queue和stack

C++语法(12)---- 模拟实现queue和stack

C++语法(11)---- 模拟实现list_哈里沃克的博客-CSDN博客icon-default.png?t=N2N8https://blog.csdn.net/m0_63488627/article/details/129773011目录

1.设计模式

2.实现stack

3.实现queue

4.deque


1.设计模式

设计模式是写代码的一种策略,面对项目有套路的设计,这里只介绍几种设计模式

1.迭代器模式,stl中的迭代器在封装后不暴露内部细节,使得上层使用时达到一种统一的方法访问

2.适配器模式,用于转换,通关原有的内容封装转换出自己想要的东西

2.实现stack

自己想要实现,需要数组一点一点堆上去,但是适配器模式下,我们想想是否可以用写过的stl来实现呢?其实答案很明显vector和list可以来封装转化

stack用vector更好,因为删除只涉及尾删

下面是细节代码

#pragma once
#include<iostream>
#include<vector>
#include<list>namespace MY
{template<class T,class Container = vector<T>>class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top(){return _con.back();}bool empty(){return _con.empty();}size_t size(){return _con.size();}private:Container _con;};
}

3.实现queue

如法炮制,queue也可以使用适配器模式封装来得到自己想要的

queue用list更好,因为只支持头删,vector头删效率低

#pragma once
#include<iostream>
#include<vector>
#include<list>namespace MY
{template<class T, class Container = list<T>>class queue{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}const T& front(){return _con.front();}const T& back(){return _con.back();}bool empty(){return _con.empty();}size_t size(){return _con.size();}private:Container _con;};
}

4.deque

1.我们之前讲过,list和vector各有优缺点,那么是否有一个stl可以弥补二者的缺点呢

2.deque就是这样一个数据结构,他头尾插入删除效率高,且支持随机访问

 

不过,它真的万金油吗?这就需要介绍一下它的具体实现方式了

1.其实现模式大致如此,即一个指针数组指向多个数组,在中间开始 

2.头插就是将数据往最前面的数组尾部向前插入

3.尾插就是将数据往最后面的数组尾部向后插入

4.对于随机访问就是通过取模等一系列运算找到某个特定数组的下标,那么我们知道其实随机访问的数据量很大,其实这些取模的运算也耗费时间,不如vector的直接随机访问

5.对于中间插入,还需要把后面的或者前面的数据往两边移动,会发现如果数据量庞大,别说移动的耗费时间效率,实现也是一个非常恼人的操作,对比其list的中间插入只需要改变指针指向相比确实差得远了

6.如果数据过大,这些存数据的数组不需要改变,只需要改变指针数组的容量,随后将里面的内容复制,再释放原来的空间

7.如果针对要计较起来,其实数据浪费也有存在,这个得看数组的设计容量多大和实际数据的大小对比了