#include <assert.h>
#include <iostream>
#include "myStack.h"
using namespace std;
const int stackIncreament = 20;
template <class T>
class seqStack :public myStack<T> //不能写作public myStack因为继承的是模板类,所以public myStack<T>
{
public:
seqStack (int sz=50) ;//构造函数为空
void push(T & x);
bool pop(T & x);//栈顶元素出栈,由x返回
bool getPop(T & x)const;//读取栈顶元素由x返回
bool isEmpty() const
{
return (top == - 1) ? true : false;
}
bool isFull()
{
return (top == maxSize - 1) ? true : false;
}
friend std::ostream & operator <<(std::ostream & os, seqStack<T> & s)//只能定义在内部
{
os << "top=" << s.top << endl;
for (int i = 0; i < s.top; i++)
{
os << i << ":" << s.element[i] << endl;
}
return os;
}
private:
T * element;
int top;//top不是指针
int maxSize;//没有私有数据成员
void overFlow();
};
template <class T>
seqStack<T>::seqStack(int sz = 50)
{
maxSize = sz;
top = -1;
element=new T[maxSize];
assert(element != NULL);
}
template <class T>
void seqStack<T>::overFlow()
{
T * newArray = new T[maxSize + stackIncreament];
if (newArray==NULL)
{
cerr << "储存分配失败!" << endl; exit(1);
}
for (int i = 0; i < top; i++)
{
newArray[i] = element[i];
maxSize = maxSize + stackIncreament;
delete[]element;
}
}
template <class T>
void seqStack<T>::push(T & x)
{
if (isFull() == true)
{
overFlow();
}
element[++top] = x;
}
template <class T>
bool seqStack<T>::pop(T & x)
{
if (isEmpty() == true)
{
return false;
}
else
{
x= element[top];
--top;
return true;
}
}
template <class T>
bool seqStack<T>::getPop(T & x) const
{
if (isEmpty() == true)
{
return false;
}
else
{
x = element[top];
return x;
}
}
template <class T>
std::ostream & operator <<(std::ostream & os, seqStack<T> & s)//只能定义在内部,这样错误
{
os << "top=" << s.top << endl;
for (int i = 0; i < s.top; i++)
{
os << i << ":" << s.element[i] << endl;
}
return os;
}