抽空实现下栈的结构,算是加深基础理解,本文先定义了MyStack这一父类,它的函数多定义为纯虚函数,这一类也是一个抽象类。以之为父类定义基于数组的子类SeqStack类以及相应函数的实现。
//Filename: MyStack.h
const int maxSize = 50;
template<class T>
class MyStack{
public:
MyStack(){}; //构造函数
virtual void push(const T& x) = 0; //x进栈,纯虚函数,需要在派生来实现函数
virtual bool pop(T& x) = 0; //弹出栈顶元素,并保存到至x
virtual bool getTop(T& x)const = 0;//读取栈顶元素,并保存至x ;加const表明,该函数只能是只读的,不能修改私有变量的值。加强安全性。
virtual bool isEmpty() const = 0; //判断是否为空
virtual bool isFull() const = 0; //判断是否满
virtual int getSize() const = 0; //获得栈中元素个数
};
//Filename: SeqStack.h
#include<assert.h>
#include<iostream>
#include "MyStack.h"
const int stackIncreament = 20; //扩展空间的增量
template<class T>
class SeqStack : public MyStack<T>{
public:
SeqStack(int sz = 50);
~SeqStack(){delete []elements;};
void push(const T &x);
bool pop(T &x);
bool getTop(T &x)const;
bool isEmpty()const{return top == -1 ? true : false;}
bool isFull() const {return top == maxSize -1 ? true : false;}
int getSize()const {return top + 1;}
void makeEmpty(){top = -1;};
private:
T *elements;
int maxSize;
int top;
void overflowProcess();//溢出处理
};
template<class T>
SeqStack<T>::SeqStack(int sz): top(-1),maxSize(sz){
elements = new T[maxSize];
assert(elements != NULL);
};
template<class T>
void SeqStack<T>::overflowProcess()
{
T *newArray = new T[maxSize + stackIncreament];
if(newArray == NULL)
cerr<<"存储分配失败!"<<endl;
for(int i =0;i<maxSize;i++)
newArray[i] = elements[i];
maxSize += stackIncreament;
delete []elements;
elements = newArray;
};
template<class T>
void SeqStack<T>::push(const T &x)
{
if(isFull())
overflowProcess();
elements[++top] = x;
};
template<class T>
bool SeqStack<T>::pop(T &x)
{
if(isEmpty())
return false;
x = elements[top--];
return true;
};
template<class T>
bool SeqStack<T>::getTop(T& x)const
{
if(isEmpty())
return false;
x = elements[top];
return true;
};