You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何实现泛型栈ADT的ToString()函数将栈内容转为字符串?

C++ 标准库的std::stack确实没有内置ToString()成员方法,该接口是Java、C#等语言的内置特性,你的判断是正确的,作业要求是自行实现泛型栈ADT并配套实现ToString()方法,不需要调用标准库现成接口。


实现思路

  • 泛型栈底层可选用动态数组或链表实现,示例用动态数组实现,逻辑更简洁适配作业场景
  • ToString()方法通过遍历栈内所有元素拼接为字符串,默认按栈顶到栈底的顺序输出,元素间用逗号分隔,外层包裹方括号
  • 采用std::ostringstream做字符串拼接,兼容所有重载了operator<<的类型,包括自定义类

完整实现代码

#include <iostream>
#include <string>
#include <sstream>
#include <stdexcept>

template <typename T>
class StackADT {
private:
    T* m_data;
    int m_top;
    int m_capacity;

    void resize() {
        m_capacity *= 2;
        T* new_data = new T[m_capacity];
        for (int i = 0; i <= m_top; ++i) {
            new_data[i] = m_data[i];
        }
        delete[] m_data;
        m_data = new_data;
    }

public:
    explicit StackADT(int init_capacity = 10) 
        : m_capacity(init_capacity), m_top(-1) {
        m_data = new T[m_capacity];
    }

    ~StackADT() {
        delete[] m_data;
    }

    void push(const T& elem) {
        if (m_top == m_capacity - 1) {
            resize();
        }
        m_data[++m_top] = elem;
    }

    void pop() {
        if (isEmpty()) {
            throw std::out_of_range("Stack underflow: cannot pop from empty stack");
        }
        --m_top;
    }

    T top() const {
        if (isEmpty()) {
            throw std::out_of_range("Stack is empty: cannot access top element");
        }
        return m_data[m_top];
    }

    bool isEmpty() const {
        return m_top == -1;
    }

    int size() const {
        return m_top + 1;
    }

    std::string ToString() const {
        if (isEmpty()) {
            return "[]";
        }
        std::ostringstream oss;
        oss << "[";
        // 栈顶到栈底输出,如需改为栈底到栈顶,修改循环起始和终止条件即可
        for (int i = m_top; i >= 0; --i) {
            oss << m_data[i];
            if (i != 0) {
                oss << ", ";
            }
        }
        oss << "]";
        return oss.str();
    }
};

// 测试用例
int main() {
    StackADT<int> int_stack;
    int_stack.push(10);
    int_stack.push(20);
    int_stack.push(30);
    std::cout << int_stack.ToString() << std::endl; // 输出 [30, 20, 10]

    int_stack.pop();
    std::cout << int_stack.ToString() << std::endl; // 输出 [20, 10]

    StackADT<std::string> str_stack;
    str_stack.push("C++");
    str_stack.push("Stack");
    str_stack.push("ADT");
    std::cout << str_stack.ToString() << std::endl; // 输出 [ADT, Stack, C++]

    return 0;
}

注意事项

  • 如需调整元素输出顺序为栈底到栈顶,将ToString方法中的循环修改为for (int i = 0; i <= m_top; ++i)即可
  • 如果需要支持自定义类作为栈元素,只需为自定义类重载std::ostream& operator<<(std::ostream&, const 自定义类&)即可正常使用ToString方法
  • 也可以封装标准库std::stack实现该ADT,只需在ToString时将栈元素临时弹出暂存,拼接完成后恢复原栈内容即可,不需要自行实现底层存储逻辑

内容的提问来源于stack exchange,提问作者BobSm2020

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:36:05