[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;
    };
相关推荐
AA陈超5 小时前
ASC学习笔记0014:手动添加一个新的属性集
c++·笔记·学习·ue5
Run_Teenage5 小时前
C++:智能指针的使用及其原理
开发语言·c++·算法
Shylock_Mister7 小时前
Linux C线程编程全指南
linux·运维·c语言
权泽谦7 小时前
C语言控制台游戏教程:从零实现贪吃蛇(附源码+讲解)
c语言·stm32·游戏
secondyoung7 小时前
Mermaid流程图高效转换为图片方案
c语言·人工智能·windows·vscode·python·docker·流程图
Mr_WangAndy7 小时前
C++_chapter15_C++重要知识点_auto,function,bind,decltype
c++·decltype·bind·function·可调用对象
万象.8 小时前
QT基础及对象树的认识
c++·qt
小张成长计划..10 小时前
【C++】2:cin和cout的介绍和使用,函数的缺省参数
c++
再卷也是菜10 小时前
C++篇(17)哈希拓展学习
c++·哈希
“愿你如星辰如月”10 小时前
Linux:进程间通信
linux·运维·服务器·c++·操作系统