#include <iostream>
#include <assert.h>
using namespace std;
const int maxsize = 100;
const int stackIncreament = 20; //栈溢出时扩展空间的增量
template<class T>
class SeqStack
{
public:
SeqStack(int sz = 100); //建立一个空栈
~SeqStack(void){delete []elements;}
void Push(const T& x);
bool Pop(T& x);
bool getTop(T& x);
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;
}
//输出栈中元素的重载操作<<
template<class T> //声明时也要加上 (VS2008)
friend std::ostream& operator<<(ostream& os,SeqStack<T>& s);
private:
T* elements; //存放栈中元素的栈数组
int top; //栈顶指针
int maxsize; //占栈可容纳的最多的元素的个数
void overflowProcess(); //栈的溢出处理
};
template<class T>
void SeqStack<T>::overflowProcess()
{
T* newArray = new T[maxsize + stackIncreament];
if(newArray == NULL)
{
cerr<<"增量分配空间失败!"<<endl;
exit(1);
}
for(int i=0;i<=top;i++)
newArray[i] = elements[i];
maxsize = maxsize+stackIncreament;
delete []elements;
elements = newArray;
}
template<class T>
SeqStack<T>::SeqStack( int sz)
:top(-1)
,maxsize(sz)
{
//创建一个尺寸为sz的空栈
elements = new T[maxsize];
//断言是否分配成功
assert(elements != NULL);
}
template<class T>
bool SeqStack<T>::getTop( T& x )
{
if(IsEmpty())
return false;
x = elements[top];
return true;
}
template<class T>
bool SeqStack<T>::Pop( T& x )
{
if(IsEmpty())
return false;
x = elements[top--];
return true;
}
template<class T>
void SeqStack<T>::Push( const T& x )
{
if(IsFull()==true)
overflowProcess();
elements[++top] = x;
}
template<class T>
std::ostream& operator<<(ostream& os,SeqStack<T>& s)
{
os<<"top ="<<s.top<<endl; //输出栈顶的位置
for(int i=0;i<=s.top;i++) //逐个输出栈中的元素的值
os<<i<<":"<<s.elements[i]<<endl;
return os;
}
int main()
{
int a[5] = {6,7,8,9,10};
SeqStack<int> stack1(5);
for(int i=0;i<5;i++)
stack1.Push(a[i]);
int b;
stack1.Pop(b);
stack1.getTop(b);
if(stack1.IsFull())
cout<<"Yes!"<<endl;
else
cout<<"No!"<<endl;
cout<<"Top = "<<b<<endl;
cout<<"Size = "<<stack1.getSize()<<endl;
cout<<stack1<<endl; //隐含调用了友元重载后的"<<"运算符
return 1;
}