首页 > 代码库 > 第34课 栈的概念及实现(上)
第34课 栈的概念及实现(上)
1. 栈的概念
(1)栈是一种特殊的线性表
(2)栈仅能在线性表的一端进行操作
①栈顶(Top):允许操作的一端
②栈底(Bottom):不允许操作的一端
(3)栈的特性——后进先出(Last In First Out)
2. 栈的操作
(1)创建栈(Stack())
(2)销毁栈(~Stack())
(3)清空栈(clear())
(4)进栈(push())
(5)出栈(pop())
(6)获取栈顶元素(top())
(7)获取栈的大小(size())
3. 栈的定义与实现
(1)栈的定义
(2)栈的顺序实现
(3)Static设计要点
①使用类模板实现。
②使用原生数组作为栈的存储空间
③使用模板参数决定栈的最大容量。
【编程实验】基于顺序存储结构的栈
//Stack.h
#ifndef _STACK_H_ #define _STACK_H_ #include "Object.h" namespace DTLib { template <typename T> class Stack : public Object { public: virtual void push(const T& elem) = 0; virtual void pop() = 0; virtual T top() const = 0; virtual void clear() = 0; virtual int size() const = 0; }; } #endif // _STACK_H_
//StaticStack.h
#ifndef _STATICSTACK_H_ #define _STATICSTACK_H_ #include "Stack.h" #include "Exception.h" namespace DTLib { template <typename T, int N> class StaticStack : public Stack<T> { protected: T m_space[N]; //栈存储空间,N为模板参数 int m_top; //栈顶标识 int m_size; //当前栈的大小 public: StaticStack() //O(1) { m_top = -1; m_size = 0; } int capacity() const //O(1) { return N; } void push(const T& elem) //O(1) { if(m_size < N){ //要注意确保异常安全,即如果T类的“=”操作符发生异常时 //m_top和m_size没被改变。 m_space[m_top + 1] = elem; m_top++; m_size++; }else{ THROW_EXCEPTION(InvalidOperationException, "No space in current stack ..."); } } void pop() //O(1) { if(m_size > 0){ m_top--; m_size--; }else{ THROW_EXCEPTION(InvalidOperationException, "No element in current stack ..."); } } T top() const //O(1) { if(m_size > 0){ return m_space[m_top]; }else{ THROW_EXCEPTION(InvalidOperationException, "No element in current stack ..."); } } void clear() //O(1) { m_top = -1; m_size = 0; } int size() const //O(1) { return m_size; } }; } #endif // _STATICSTACK_H_
//main.cpp
#include <iostream> #include "StaticStack.h" using namespace std; using namespace DTLib; int main() { StaticStack<int, 10> stack; try{ stack.pop(); }catch(const Exception& e){ cout << e.message() << endl; cout << e.location() << endl; } for(int i=0; i<10; i++){ stack.push(i); } while(stack.size() > 0){ cout << stack.top() << " "; stack.pop(); } cout << endl; return 0; } /*输出结果 No element in current stack ... ..\DTLib\StaticStack.h:48 9 8 7 6 5 4 3 2 1 0 */
4. 小结
(1)栈是一种特殊的线性表
(2)栈只允许在线性表的一端进行操作
(3)StaticStack使用原生数组作为内部存储空间
(4)StaticStack的最大容量由模板参数决定。
第34课 栈的概念及实现(上)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。