异常类 的 定义同 数据结构C++(2)线性表——vector实现(vectorList) 的 myExceptions.h 文件。
抽象基类 Stack 的定义 Stack.h :
1 #pragma once
2
3 template<typename T>
4 class Stack 5 { 6 public: 7 virtual ~Stack() {} 8 virtual bool empty() const = 0; 9 virtual int size() const = 0; 10 virtual T &top() = 0; 11 virtual void pop() = 0; 12 virtual void push(const T &theElement) = 0; 13 };
类 arrayStack 的实现 arrayStack.h :
#pragma once #include <iostream> #include <sstream> #include <string> #include <ostream> #include <algorithm> #include "Stack.h" #include "myExceptions.h" template<typename T>
class arrayStack : public Stack<T> { public: arrayStack(int initLenth = 20); ~arrayStack(); bool empty() const; int size() const; T &top(); void pop(); void push(const T &theElement); protected: void changeLenth(T* &theElement, int oldLenth, int newLenth); T *stack; private: int stackTop; int stackSize; }; template<typename T> arrayStack<T>::arrayStack(int initLenth) { if (0 >= initLenth) { std::ostringstream s; s << "initLenth = " << initLenth << "must > 0" << endl; throw illegalParameterValue(s.str()); } stackTop = -1; stackSize = initLenth; stack = new T[initLenth]; } template<typename T> arrayStack<T>::~arrayStack() { delete [] stack; } template<typename T>
void arrayStack<T>::changeLenth(T* &theElement, int oldLenth, int newLenth) { if (newLenth < 0) { std::ostringstream s; s << "newLenth = " << newLenth << "must > 0" << endl; throw illegalParameterValue(s.str()); } T *Tmp = new T[newLenth]; int minux = min(oldLenth, newLenth); copy(theElement, theElement + minux, Tmp); delete[] theElement; theElement = Tmp; } template<typename T>
bool arrayStack<T>::empty() const { return stackTop == -1; } template<typename T>
int arrayStack<T>::size() const { return stackTop + 1; } template<typename T> T &arrayStack<T>::top() { if (-1 == stackTop) throw stackEmpty(); return stack[stackTop]; } template<typename T>
void arrayStack<T>::pop() { if (-1 == stackTop) throw stackEmpty(); stack[stackTop--].~T(); } template<typename T>
void arrayStack<T>::push(const T &theElement) { if (stackTop == stackSize - 1) { changeLenth(stack, stackSize, stackSize * 2); stackSize *= 2; } stack[++stackTop] = theElement; }
参考文献:
[1].Sartaj Sahni. 数据结构、算法与应用[M]. 机械工业出版社, 2000.