数据结构基础(13) --链式栈的设计与实现
来源:互联网 发布:json返回html标签 编辑:程序博客网 时间:2024/06/08 17:48
采用链式存储的栈成为链式栈(或简称链栈), 链栈的优点是便于多个栈共享存储空间和提高其效率, 且不存在栈满上溢的情况(因为链栈是靠指针链接到一起,只要内存够大, 则链栈理论上可以存储的元素是没有上限的);
与顺序栈相比, 由于顺序栈是采用的数组实现, 因此一旦数组填满, 则必须重新申请内存, 并将所有元素”搬家”, 而链栈则省略了这一”耗时耗力”的工作, 但却需要付出附加一个指针的代价;
链栈通常采用单链表实现, 并规定所有的操作都必须实在单链表的表头进行, 而且w我们的链栈没有头结点, m_top直接指向栈顶元素;
链式栈的图示如下:
链栈节点构造:
template <typename Type>class ChainNode{ template <typename T> friend ostream &operator<<(ostream &os, const LinkStack<T> &stack); friend class LinkStack<Type>;private: ChainNode(const Type &_data, ChainNode *_next = NULL) :data(_data), next(_next) {} Type data; ChainNode *next;};
链栈设计:
template <typename Type>class LinkStack{ template <typename T> friend ostream &operator<<(ostream &os, const LinkStack<T> &stack);public: LinkStack(): m_top(NULL) {} ~LinkStack() { makeEmpty(); } bool isEmpty() const { return m_top == NULL; } void pop() throw(std::out_of_range); const Type &top() const throw(std::out_of_range); void push(const Type &data); void makeEmpty();private: ChainNode<Type> *m_top;};
栈的三大操作:
template <typename Type>const Type &LinkStack<Type>::top() constthrow (std::out_of_range){ if (isEmpty()) throw std::out_of_range("stack is empty, can`t get data"); return m_top->data;}
template <typename Type>void LinkStack<Type>::pop()throw (std::out_of_range){ if (isEmpty()) throw std::out_of_range("stack is empty, can`t delete"); ChainNode<Type> *deleteNode = m_top; m_top = m_top->next; delete deleteNode;}
template <typename Type>void LinkStack<Type>::push(const Type &data){ //此处是整个链栈的关键点 // 该操作会生成一个节点, // 并自动将m_top上移一格, // 而且将m_top原先指向的节点, 作为新生成的节点的下一节点 //注意此处 //如果第一次运行push, 则原m_top为NULL // 新m_top指向第一个元素 m_top = new ChainNode<Type>(data, m_top);}
清空整个栈:
template <typename Type>void LinkStack<Type>::makeEmpty(){ while (!isEmpty()) { pop(); }}
输出栈内所有内容:
template <typename Type>ostream &operator<<(ostream &os, const LinkStack<Type> &stack){ ChainNode<Type> *currentNode = stack.m_top; while (currentNode != NULL) { cout << currentNode->data << ' '; currentNode = currentNode->next; } return os;}
测试代码:
int main(){ LinkStack<int> test; for (int i = 0; i < 10; ++i) { test.push(rand()%100); } cout << test << endl; cout << "top = " << test.top() << endl; test.pop(); cout << "top = " << test.top() << endl; test.push(1); cout << "top = " << test.top() << endl; while (!test.isEmpty()) { test.pop(); } cout << test << endl; test.push(11); test.push(22); test.push(33); cout << test << endl; test.makeEmpty(); try { cout << "top = " << test.top() << endl; } catch (const std::exception &e) { cerr << e.what() << endl; } return 0;}
2 0
- 数据结构基础(13) --链式栈的设计与实现
- 数据结构基础(13) --链式栈的设计与实现
- 数据结构基础(13) --链式栈的设计与实现
- 数据结构基础(14) --链式队列的设计与实现
- 数据结构基础(14) --链式队列的设计与实现
- 数据结构基础(14) --链式队列的设计与实现
- 数据结构与算法设计---链式栈的实现(C++)
- 企业级数据结构-栈的链式存储设计与实现
- 数据结构基础【06】栈的链式实现
- 数据结构与算法设计---链式队列的实现(C++)
- 数据结构基础【08】队列的链式实现
- 数据结构-链式栈的实现
- 数据结构---栈的链式实现
- 数据结构-->栈的链式实现
- 数据结构---C语言栈的链式表示与实现
- 数据结构基础(6) --顺序栈的设计与实现
- 数据结构基础(6) --顺序栈的设计与实现
- 数据结构基础(6) --顺序栈的设计与实现
- VC中List Control简单用法
- Tomcat启动报“严重: Error listenerStart”错误的解决办法
- Cocos2d-x碰撞检查与消灭的实现
- 《图灵和ACM图灵奖》阅读笔记
- 重构笔记——分解临时变量
- 数据结构基础(13) --链式栈的设计与实现
- Windows下安装redis服务
- php 类和对象
- NSTextField 快捷键失效的解决办法
- VC如何获取并显示当前系统时间
- [Python] collections — High-performance container datatypes
- TDD-LTE与FDD-LTE区别之频段分配
- 使用ant编译之签名问题
- 数据仓库引擎衡量标准