C++ 学习系列 -- std::stack 与 std::queue

一  std::stack 与 std::queue 分别是什么?

 两者均是 c++ 中的序列化容器,区别在于:

 std::stack   元素是先进后出

 std::queue 元素是先进先出

二  std::stack 与 std::queue 原理

1 std:statck

C++ 学习系列 -- std::stack 与 std::queue_第1张图片

2. std::queue

C++ 学习系列 -- std::stack 与 std::queue_第2张图片

两者底层容器可以是 list 也可以是 deque ;

为了保证 两个序列式容器的特点, 两者均不支持遍历,也不支持迭代器。

三  常见函数接口与使用

1.  std::stack

1.1 构造函数

std::stack::stack - cppreference.com

函数 说明
stack() 空构造函数

1.2  容器修改

              

函数 说明
push 在栈顶 放入元素
emplace 在栈顶 放入元素,也可以放入元素类的参数,实现原地构造
pop 弹出栈顶元素

1.3 容器访问

函数 说明
top 返回栈顶元素的引用

1.4 容器空间

函数 说明
empty 判断栈是否为空
size 返回栈中元素个数

代码如下:

#include
#include


int main()
{

   // 1. constructor
    std::stack tmp_stack;
    
    
    // 2. Modifiers
    tmp_stack.push(1);
    tmp_stack.push(2);
    tmp_stack.push(3);
    tmp_stack.push(3);
    
    tmp_stack.pop();    
    
    tmp_stack.emplace(4);
    tmp_stack.emplace(5);
    
    
    // 3. Element access
    
    std::cout << tmp_stack.top() << std::endl;
    std::cout << "------" << std::endl;

    // 4. Capacity

    std::cout << tmp_stack.empty() << std::endl;
    std::cout << tmp_stack.size() << std::endl;
    std::cout << "------" << std::endl;

    while (!tmp_stack.empty()) {
        std::cout << tmp_stack.top() << " ";
        tmp_stack.pop();
    }
    return 0;
}

C++ 学习系列 -- std::stack 与 std::queue_第3张图片

2. std::queue

1.1 构造函数

   https://en.cppreference.com/w/cpp/container/queue/queue

函数 说明
queue 空构造函数

1.2  容器修改

函数 说明
push 在队尾放入元素
emplace 在队尾 放入元素,也可以放入元素类的参数,实现原地构造
pop 弹出队首元素

1.3 容器访问

函数 说明
front 返回队首元素的引用
back 返回队尾元素的引用

1.4 容器空间

函数 说明
empty 判断queue 是否为空
size 返回queue中元素个数

   代码:

  

#include
#include

int main()
{
     // 1. constructor
    std::queue tmp_queue;

    // 2. Modifiers
    tmp_queue.push(1);
    tmp_queue.push(2);
    tmp_queue.push(3);
    tmp_queue.push(3);

    tmp_queue.pop();

    tmp_queue.emplace(4);
    tmp_queue.emplace(5);


    // 3. Element access

    std::cout << tmp_queue.front() << std::endl;
    std::cout << tmp_queue.back() << std::endl;
    std::cout << "------" << std::endl;

    // 4. Capacity

    std::cout << tmp_queue.empty() << std::endl;
    std::cout << tmp_queue.size() << std::endl;
    std::cout << "------" << std::endl;

    while (!tmp_queue.empty()) {
        std::cout << tmp_queue.front() << " ";
        tmp_queue.pop();
    }

  输出:

   C++ 学习系列 -- std::stack 与 std::queue_第4张图片

四  简单实现

下面代码中的 my_deque.h 为 这个博客中实现的 my_deque

C++ -- 学习系列 std::deque 的原理与使用-CSDN博客

1. my_stack

// my_stack.h

#include"my_deque.h"

template
class my_stack
{
public:
    my_stack()
    {

    }
    ~my_stack()
    {

    }

    void push(T& val)
    {
        data.push_back(val);
    }

    void push(T&& val)
    {
        data.push_back(val);
    }

    T& top()
    {
        return data.back();
    }

    void pop()
    {
        data.pop_back();
    }

    int size()
    {
        return data.size();
    }

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

private:
    my_deque data;

};
// main.cpp
int main()
{
    // 1. constructor
    std::stack tmp_stack;


    // 2. Modifiers
    tmp_stack.push(1);
    tmp_stack.push(2);
    tmp_stack.push(3);
    tmp_stack.push(3);

    tmp_stack.pop();

    tmp_stack.emplace(4);
    tmp_stack.emplace(5);


    // 3. Element access

    std::cout << tmp_stack.top() << std::endl;
    std::cout << "------" << std::endl;

    // 4. Capacity

    std::cout << tmp_stack.empty() << std::endl;
    std::cout << tmp_stack.size() << std::endl;
    std::cout << "------" << std::endl;

    while (!tmp_stack.empty()) {
        std::cout << tmp_stack.top() << " ";
        tmp_stack.pop();
    }

    return 0;
}

输出:

  

2. my_queue

// my_queue.h

#include"my_deque.h"

template
class my_queue
{
public:
    my_queue()
    {

    }
    ~my_queue()
    {

    }

    void push(T& val)
    {
        data.push_back(val);
    }

    void push(T&& val)
    {
        data.push_back(val);
    }
    void pop()
    {
        data.pop_front();
    }

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

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

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

    int size()
    {
        return data.size();
    }

private:
    my_deque  data;

};


// main.cpp

int main()
{
    // 1. constructor
    my_queue tmp_queue;


    // 2. Modifiers
    tmp_queue.push(1);
    tmp_queue.push(2);
    tmp_queue.push(3);
    tmp_queue.push(3);

    tmp_queue.pop();


    // 3. Element access

    std::cout << tmp_queue.front() << std::endl;
    std::cout << tmp_queue.back() << std::endl;
    std::cout << "------" << std::endl;

    // 4. Capacity

    std::cout << tmp_queue.empty() << std::endl;
    std::cout << tmp_queue.size() << std::endl;
    std::cout << "------" << std::endl;

    while (!tmp_queue.empty()) {
        std::cout << tmp_queue.front() << " ";
        tmp_queue.pop();
    }

    return 0;
}

 输出:

C++ 学习系列 -- std::stack 与 std::queue_第5张图片

你可能感兴趣的:(c++,学习,开发语言)