C++: stack类和queue类的使用及模拟实现

目录

一、stack类

 1.1stack的介绍和使用

2.stack的函数和接口

3.stack的模拟实现

二、queue类

2.1 queue的介绍和使用

2.2queue的使用,略。

2.3 queue类的模拟实现


一、stack类

 1.1stack的介绍和使用

 1.11 stack是一种容器适配器,专门用在具有先进后出的上下文环境中,插入和删除都只能从一端操作。

 1.12 stack作为容器适配器实现,它底层是其他类或容器。它只需要提供一些函数接口实现功能就好。

 1.13stack的底层容器可以是任何标准的容器类也可以是其他特定的容器类。这些容器应该支持以下操作:

     empty:判空

     push:压一个元素入栈

     top:取栈顶的元素

     pop:在栈顶出数据

1.14 标准默认容器vector,list,deque都符合这些需求,默认情况下,如果没有为stack指定特定底层容器,默认情况下均用deque。

deque也是一种特殊的容器,它的功能是链表和顺序表的结合体。它存数据可以从中间插入,也可以从尾插,就是访问数据不如vector高效,随机插入删除也比不上链表。所以平常大家都不怎么用它。

2.stack的函数和接口

stack()  构造函数,构造一个空栈

empty()  判断栈是否是空的

size()   判断这个栈元素的个数

top()  取栈顶的元素

push()   压栈

pop() 在栈顶出数据

3.stack的模拟实现

说明:模板的定义这里第一个class T是类型,第二个是底层的容器。所以如果要声明一个stack的变量,按照以下形式:

 命名空间::stack<int,vector<int>>   s1;

这里把T实例化成了int ,class Con被实例化成了vector<int>,这两个也可以用其他的类型和容器替代。

 template<class T, class Con = deque<T>>
 class stack
 {
 public:
     stack()
     {

     }
     void push(const T& x)
     {
         _c.push_back(x);
     }
     void pop()
     {
         _c.pop_back();
     }
     T& top()
     {
         return _c.front();
     }
     const T& top()const
     {
         return _c.front();
     }
     size_t size()const
     {
         return _c.size();
     }
     bool empty()const
     {
         return _c.empty();
     }
 private:
     Con _c;
 };

二、queue类

2.1 queue的介绍和使用

2.11 队列是一种容器适配器,专门用于在FIFO上下文环境中操作,其中从一端插入元素,从另一端读取元素。不支持随机访问(也不能支持)。

2.12 队列作为容器适配器实现,容器适配器,就是将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。

2.13 底层容器是标准类容器,也可以是其他特定的容器类。该底层容器至少支持以下操作。

empty:检测队列是否为空

size:检测队列的元素个数

front:取出队列第一个元素

back:取出队列最后一个元素

push:尾插一个元素

pop:在队列头部出队列

2.14 标准容器类deque和list满足了这些要求,默认情况下,如果没有为deque实例化指定容器类,则使用标准容器类deque。

2.2queue的使用,略。

在2.13已经介绍了。

2.3 queue类的模拟实现

注意要点和stack类的模拟实现差不多,没什么难度。需要注意的是接口不一样的。

栈取首元素,是用top函数,而队列取首元素用front函数。

 template<class T, class Con = deque<T>>
 class queue
 {
 public:
     queue()
     {

     }
     void push(const T& x)
     {
         _c.push_back(x);
     }
     void pop()
     {
         _c.pop_back();
     }

     T& back()
     {
        return _c.back();
     }

     const T& back()const
     {
         return _c.back();
     }

     T& front()
     {
         return _c.front();
     }

     const T& front()const
     {
         return _c.front();
     }

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

     bool empty()const
     {
         return _c.empty();
     }

 private:
     Con _c;
 };

    

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值