[STL]stack和queue模拟实现

[STL]stack和queue模拟实现

文章目录

stack模拟实现

stack是一种容器适配器,标准容器vector、deque、list都可以作为实现stack的底层数据结构,因为它们都具备以下功能:

  • empty:判空操作
  • back:获取尾部元素操作
  • push_back:尾部插入元素操作
  • pop_back:尾部删除元素操作

stack会将这些已有的容器进行转化,转换成能够以栈的方式使用的形式,stack的整体结构如下:

c++ 复制代码
template<class T, class Container = vector<T>>
    class stack
    {
        public:
        void push(const T& x) {}; //将数据压入栈中
        void pop() {}; //将栈顶数据弹出
        const T& top() {};	//获取栈顶数据
        size_t size() {};	//获取栈的数据个数
        bool empty() {};	//判断栈是否为空
        private:
        Container _con;
    };

说明: 由于stack可以由不同的容器实现,模板中的Container用于传入不同种类的容器。

push函数

push函数的功能是将数据压入栈中,只需要使用各个容器都可以使用的尾插函数来模拟实现即可。

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

pop函数

pop函数的功能是将栈顶的数据删除,只需要使用各个容器都可以使用的尾删函数来模拟实现即可。

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

top函数

top函数的功能是获取栈顶的数据,只需要使用各个容器都可以使用的获取尾部数据的函数来模拟实现即可,然后返回数据的const引用。

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

size函数

size函数的功能是获取栈内数据个数,只需要使用各个容器都可以使用的获取数据个数函数来模拟实现即可。

c++ 复制代码
size_t size()
{
    return _con.size();
}

说明: 返回值使用的size_t是无符号整数,是为了兼容不同容器可能会有的有符号整数和无符号整数的区别。

empty函数

empty函数的功能是判断栈是否为空,只需要使用各个容器都可以使用的判断是否为空的函数来模拟实现即可。

c++ 复制代码
bool empty()
{
    return _con.empty();
}

stack模拟实现的完整代码

stack模拟实现的完整代码如下:

c++ 复制代码
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();
        }

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

        bool empty()
        {
            return _con.empty();
        }

        private:
        Container _con;
    };

queue模拟实现

queue是一种容器适配器,标准容器类deque和list都可以作为实现queue的底层数据结构,因为它们都具备以下功能:

  • empty:检测队列是否为空
  • size:返回队列中有效元素的个数
  • front:返回队头元素的引用
  • back:返回队尾元素的引用
  • push_back:在队列尾部入队列
  • pop_front:在队列头部出队列

queue会将这些已有的容器进行转化,转换成能够以队列的方式使用的形式,queue的整体结构如下:

c++ 复制代码
template<class T, class Container=list<T>>
    class queue
    {
        public:
        void push(const T& x); //将数据入队
        void pop(); //将栈顶数据出队
        const T& front();	//获取队头数据
        const T& back();	//获取队尾数据
        size_t size();	//获取栈的数据个数
        bool empty();	//判断栈是否为空
        private:
        Container _con;
    };

说明: 由于queue可以由不同的容器实现,模板中的Container用于传入不同种类的容器。

push函数

push函数的功能是尾插数据入队,只需要使用各个容器都可以使用的尾插函数来模拟实现即可。

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

pop函数

pop函数的功能是将队头的数据删除,只需要使用各个容器都可以使用的头删函数来模拟实现即可。

c++ 复制代码
void pop()
{
    _con.pop_front();
}

front函数

front函数的功能是获取队头的数据,只需要使用各个容器都可以使用的获取头部数据的函数来模拟实现即可,然后返回数据的const引用。

c++ 复制代码
const T& top()
{
    return _con.front();
}

back函数

back函数的功能是获取队尾的数据,只需要使用各个容器都可以使用的获取尾部数据的函数来模拟实现即可,然后返回数据的const引用。

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

size函数

size函数的功能是获取队列内数据个数,只需要使用各个容器都可以使用的获取数据个数函数来模拟实现即可。

c++ 复制代码
size_t size()
{
    return _con.size();
}

说明: 返回值使用的size_t是无符号整数,是为了兼容不同容器可能会有的有符号整数和无符号整数的区别。

empty函数

empty函数的功能是判断队列是否为空,只需要使用各个容器都可以使用的判断是否为空的函数来模拟实现即可。

c++ 复制代码
bool empty()
{
    return _con.empty();
}

queue模拟实现的完整代码

queue模拟实现的完整代码如下:

c++ 复制代码
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();
        }

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

        bool empty()
        {
            return _con.empty();
        }

        private:
        Container _con;
    };
相关推荐
疑惑的杰瑞几秒前
【C】顺序结构
c语言·内存划分
小龙报1 分钟前
【初阶数据结构】从 “数组升级” 到工程实现:动态顺序表实现框架的硬核拆解指南
c语言·数据结构·c++·算法·机器学习·信息与通信·visual studio
SELSL4 分钟前
Linux文件属性及目录
linux·c语言·linux目录文件·linux文件属性、目录api·linux文件属性
我不是8神11 分钟前
序列化与反序列化详解
c++
MSTcheng.16 分钟前
【C++STL】map / multimap 保姆级教程:从底层原理到实战应用!
开发语言·c++·stl·map·红黑树
ULTRA??24 分钟前
基于range的函数式编程C++,python比较
c++·python·kotlin·c++20
秦苒&28 分钟前
【C语言指针五】转移表、回调函数、qsort、qsort函数的模拟实现
c语言·开发语言·c#
旧梦吟35 分钟前
脚本网页 C与汇编详解
c语言·css3·html5
闻缺陷则喜何志丹41 分钟前
【计算几何 二分查找】P5485 [JLOI2010] 铁人双项比赛|普及+
c++·数学·二分查找·计算几何·洛谷
..空空的人1 小时前
C++基于protobuf实现仿RabbitMQ消息队列---服务器模块认识1
服务器·开发语言·c++·分布式·rabbitmq·protobuf