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
相关产品推荐
相关产品推荐

