云计算百科
云计算领域专业知识百科平台

C++ STL栈与队列模拟实现详解

好的,我们来详细讲解如何在C++中模拟实现STL中的stack和queue容器适配器。这两个容器都是基于其他底层容器实现的,体现了适配器模式的思想。


一、stack 的模拟实现

stack(栈)是一种后进先出(LIFO)的数据结构。它只允许在容器的一端进行插入和删除操作。

1. 核心思想
  • 底层容器:stack 通常基于 deque、list 或 vector 实现(默认为 deque)。
  • 操作限制:只暴露 push(入栈)、pop(出栈)、top(访问栈顶)等接口。
2. 代码实现

template<class T, class Container = std::deque<T>>
class Stack {
public:
// 入栈
void push(const T& x) {
_con.push_back(x);
}

// 出栈
void pop() {
_con.pop_back();
}

// 访问栈顶元素
T& top() {
return _con.back();
}

const T& top() const {
return _con.back();
}

// 判空
bool empty() const {
return _con.empty();
}

// 元素个数
size_t size() const {
return _con.size();
}

private:
Container _con; // 底层容器
};

http://my.tv.sohu.com/us/442093011/698241831.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MTgzMS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698241958.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MTk1OC5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242042.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjA0Mi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242105.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjEwNS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242053.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjA1My5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242057.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjA1Ny5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242112.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjExMi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698241972.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MTk3Mi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698241976.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MTk3Ni5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242071.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjA3MS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698241897.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MTg5Ny5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242079.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjA3OS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242209.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjIwOS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242309.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjMwOS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242215.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjIxNS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242148.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjE0OC5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242217.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjIxNy5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242154.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjE1NC5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242332.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjMzMi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242232.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjIzMi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242375.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjM3NS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242473.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjQ3My5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242383.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjM4My5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242627.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjYyNy5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242385.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjM4NS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242634.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjYzNC5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242498.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjQ5OC5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242902.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjkwMi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242296.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjI5Ni5zaHRtbA==.html  

3. 关键点
  • 默认使用 std::deque 作为底层容器。
  • push 操作调用底层容器的 push_back。
  • pop 操作调用底层容器的 pop_back。
  • top 操作调用底层容器的 back。

二、queue 的模拟实现

queue(队列)是一种先进先出(FIFO)的数据结构。它允许在容器的一端插入,另一端删除。

1. 核心思想
  • 底层容器:通常基于 deque 或 list 实现(默认为 deque)。
  • 操作限制:只暴露 push(入队)、pop(出队)、front(访问队头)等接口。
2. 代码实现

template<class T, class Container = std::deque<T>>
class Queue {
public:
// 入队
void push(const T& x) {
_con.push_back(x);
}

// 出队
void pop() {
_con.pop_front();
}

// 访问队头元素
T& front() {
return _con.front();
}

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

// 访问队尾元素
T& back() {
return _con.back();
}

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

// 判空
bool empty() const {
return _con.empty();
}

// 元素个数
size_t size() const {
return _con.size();
}

private:
Container _con; // 底层容器
};

http://my.tv.sohu.com/us/442093011/698241831.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MTgzMS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698241958.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MTk1OC5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242042.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjA0Mi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242105.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjEwNS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242053.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjA1My5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242057.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjA1Ny5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242112.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjExMi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698241972.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MTk3Mi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698241976.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MTk3Ni5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242071.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjA3MS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698241897.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MTg5Ny5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242079.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjA3OS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242209.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjIwOS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242309.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjMwOS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242215.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjIxNS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242148.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjE0OC5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242217.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjIxNy5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242154.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjE1NC5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242332.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjMzMi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242232.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjIzMi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242375.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjM3NS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242473.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjQ3My5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242383.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjM4My5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242627.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjYyNy5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242385.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjM4NS5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242634.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjYzNC5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242498.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjQ5OC5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242902.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjkwMi5zaHRtbA==.html http://my.tv.sohu.com/us/442093011/698242296.shtml https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODI0MjI5Ni5zaHRtbA==.html  

3. 关键点
  • 默认使用 std::deque 作为底层容器。
  • push 操作调用底层容器的 push_back。
  • pop 操作调用底层容器的 pop_front。
  • front 和 back 分别访问队头和队尾。

三、底层容器的选择

  • stack:

    • deque:两端操作高效(默认选择)。
    • vector:尾部操作高效,但头部删除效率低(不推荐)。
    • list:任意位置操作高效,但内存不连续。
  • queue:

    • deque:两端操作高效(默认选择)。
    • list:任意位置操作高效(推荐替代)。
    • vector:头部删除效率低(不适用)。

  • 四、总结

    • stack 和 queue 都是容器适配器,通过封装底层容器并提供受限接口实现特定行为。
    • 默认底层容器为 deque,因其支持高效的两端操作。
    • 通过模板参数可替换底层容器(如 Stack<int, list<int>>)。

    // 示例:使用 list 作为 stack 的底层容器
    Stack<int, std::list<int>> s;
    s.push(1);
    s.push(2);
    std::cout << s.top(); // 输出 2

    通过模拟实现,我们可以更深入地理解STL的设计思想:复用已有组件,通过适配器模式扩展功能。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » C++ STL栈与队列模拟实现详解
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!