如何在C++中不弹出元素也不使用循环打印完整栈?
C++实现栈直接打印的方案
C++标准库的std::stack为容器适配器,默认没有提供整体打印的接口,我们可以利用其底层容器成员为protected属性的特性,在不弹出元素、不手动编写循环的前提下实现和Java一致的打印效果。
实现思路
继承std::stack暴露其底层容器成员c,重载输出运算符<<,使用标准库算法std::copy完成遍历打印,不需要编写显式的循环逻辑,也不会修改栈内任何元素。
完整可运行代码
#include <stack> #include <iostream> #include <algorithm> #include <iterator> // 可直接打印的栈实现,兼容std::stack的所有原生用法 template<typename T, typename Container = std::deque<T>> class PrintableStack : public std::stack<T, Container> { public: friend std::ostream& operator<<(std::ostream& os, const PrintableStack<T, Container>& stk) { os << "["; if (!stk.empty()) { // 标准库算法实现遍历,无手动循环 std::copy(stk.c.begin(), std::prev(stk.c.end()), std::ostream_iterator<T>(os, ", ")); os << stk.c.back(); } os << "]"; return os; } }; int main() { PrintableStack<int> s; s.push(1); s.push(2); s.push(3); // 直接打印,和Java用法完全一致 std::cout << s << std::endl; // 验证栈元素未被修改 std::cout << "打印后栈大小: " << s.size() << std::endl; return 0; }
输出效果
[1, 2, 3] 打印后栈大小: 3
方案特性
- 完全满足要求:打印过程不会弹出任何元素,也不需要开发者编写任何for/while循环
- 兼容
std::stack的所有原生接口,push、pop、top、empty等方法的用法和原生栈完全一致 - 打印格式可以根据需求自定义调整,只需要修改
operator<<内的输出逻辑即可
内容的提问来源于stack exchange,提问作者user14101590
相关产品推荐
相关产品推荐

