1、栈的概念及实现
栈的定义
-栈是—种特殊的线性表
-栈仅能在线性表的—端进行操作
栈顶(Top) : 允许操作的—端
栈底(Bottom) : 不允许操作的—端
栈的特性
- 后进先出( Last In First Out)栈的操作
-创建栈( Stack() )
- 销毁栈( ~Stack() )
-清空栈( clear() )
-进栈( push() )
-出栈( pop() )
-获取栈顶元素( top() )
-获取栈的大小( size() )
栈的实现
栈的顺序实现
StaticStack设计要点
- 类模板
使用原生数组作为栈的存储空间
使用模板参数决定栈的 最大容量
2、编程实验
基于顺序存储结构的栈 StaticStack.hStack.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& e) = 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]; int m_top; int m_size; public: StaticStack() { m_top = -1; m_size = 0; } int capacity() const { return N; } void push(const T& e) { if(m_size < N) { m_space[m_top+1] = e; //T可能是类类型,保证异常安全 m_top++; m_size++; } else { THROW_EXCEPTION(InvalidParameterException,"No space in current stack ..."); } } void pop() { if(m_size > 0) { m_top--; m_size--; } else { THROW_EXCEPTION(InvalidParameterException,"No element in current stack ..."); } } T top() const { if(m_size > 0) { return m_space[m_top]; } else { THROW_EXCEPTION(InvalidParameterException,"No element in current stack ..."); } } void clear() { m_top = -1; m_size = 0; } int size() const { return m_size; } }; } #endif // STATICSTACK_H
main.cpp
#include <iostream> #include"StaticStack.h" using namespace std; using namespace DTLib; int main() { StaticStack<int,5> stack; try { stack.pop(); } catch(const Exception& e) { cout<<e.message()<<endl; cout<<e.location()<<endl; } for(int i=0;i<5;i++) { stack.push(i); } while(stack.size() > 0) { cout<<stack.top()<<" "; stack.pop(); } return 0; }
3、小结
栈是—种特殊的线性表
栈只允许在线性表的—端进行操作
StaticStack使用原生数组作为内部存储空间
StaticStack的最大容量由模板参数决定