stack和queue

一、stack的介绍和使用
1.stack的介绍
stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取工作。
stack的底层容器可以是任何标准的容器类模板或者其他特定的容器类,这些容器应该支持empty、back、push_back、pop_back等操作

2.stack的使用

stack (const container_type& ctnr=container_type())                  //构造空的栈
bool empty()  const                                       //检测stack是否为空
size_type size() const                                   //返回stack中元素的个数
value_type& top()                                        //返回栈顶元素的引用
const value_type& top() const                             //返回栈顶元素的const引用
void push(const value_type& val)                          //将元素val压入stack中
void pop()                                                  //将stack尾部的元素弹出
template  void emplace(Args&&...args)            //在stack的栈顶构造元素
void swap(stack& x)                                                //交换两个栈中的元素


3.最小栈问题

class MinStack {
public:

    MinStack() {
     
    }
    
    void push(int x) {
        _elem.push(x);
        if((_min.empty())||(x<=_min.top()))
            _min.push(x);
    }
    
    
    void pop() {
        if(_elem.top()==_min.top())
            _min.pop();
        _elem.pop();
    }
    
    int top() {
        return _elem.top();
    }
    
    int getMin() {
        return _min.top();
    }
private:
    std::stack _elem;
    std::stack _min;
};

二、queue的介绍和使用
1.queue的介绍

队列是一种容器适配器,专门用于在FIFO上下文中操作,其中从容器一端插入元素,从另一端提取元素
queue的底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器至少应支持empty、size、front、back、push_back、pop_front等操作

默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque

2.queue的使用

queue(const container_type& ctnr=container_type())                      //构造空的队列
bool empty() const                     //检测队列是否为空,是返回true,否则返回false
size_t size() const                     //返回队列中有效元素个数
value_type& front()                   //返回队头元素的引用
const value_type& front() const             //返回队头元素的const引用
value_type& back()                             //返回队尾元素的引用
const value_type& back() const         //返回队尾元素的const引用
void push(value_type& val)                //在队尾将元素val入队列
void swap(queue& x)                         //交换两个队列中的元素

三、priority_queue的介绍和使用
1.介绍
优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含元素最大的
此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素
底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。容器应该可以通过随机访问迭代器访问,并支持empty、size、front、push_back、pop_back等操作
2.使用

priority_queue(const Compare& x=Compare(),const Container& y=Container());                 //构造一个空的优先级队列
bool empty() const                               //检测优先级队列是否为空,是返回true,否则返回false
const value_type& top() const             //返回优先级队列中最大(最小)元素
void push (const T& x)                          //在优先级队列中插入元素x
void pop()                                             //删除优先级队列中最大(最小)元素

注意:

  • 默认情况下优先级队列是大堆
  • 如果在优先级队列中放自定义类型的数据,用户需要在自定义类型中提供>或<的重载

四、容器适配器
1.虽然stack、queue、priority_queue中也可以存放元素,但在STL中没有将其划分在容器的行列,而是将其称为容器适配器,这是因为每个容器在底层都有自己的实现方式,而stack、queue、priority_queue只是在底层将其他容器进行了封装。

2.为什么选择deque作为stack和queue的底层默认容器?

  • stack和queue不需要遍历(因此它们没有迭代器),只需要在固定的一端或者两端进行操作
  • 在stack中元素增长时,deque的效率比vector高;queue的元素增长时,deque不仅效率高,而且内存使用率高

你可能感兴趣的:(C++)