#ifndef STRUCT_STACK_H
#define STRUCT_STACK_H
template <class T>
class structstrack{
public:
virtual void Push(const T&x)=0;
virtual bool Pop(T&x)=0;
virtual bool getTop(T&x)const=0;
virtual bool IsEmpty()const=0;
virtual bool IsFull()const=0;
virtual int getSize()const=0;
};
#endif
// StackStruct.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "StructStack.h"
#include<iostream>
#include<assert.h>
using namespace std;
const int stackIncreament=20;
template <class T>
class SeqStack:public structstrack<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;}
friend ostream&operator<<<T>(ostream&os,SeqStack<T>&s);
private:
T *elements;
int top;
int maxSize;
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<<"Allocation spaces error."<<endl;
exit(1);
}
for(int i=0;i<=top;++i)newArray[i]=elements[i];
maxSize=maxSize+stackIncreament;
delete[]elements;
elements=newArray;
}
template<class T>
void SeqStack<T>::Push(const T&x){
if(IsFull()==true)overflowProcess();
elements[++top]=x;
}
template<class T>
bool SeqStack<T>::Pop(T&x){
if(IsEmpty()==true)return false;
x=elements[top--];
return true;
}
template<class T>
bool SeqStack<T>::getTop(T&x)const{
if(IsEmpty()==true)return false;
x=elements[top];
return true;
}
template <class T>
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 _tmain(int argc, _TCHAR* argv[])
{
SeqStack<int> ss;
int tmp=0;
for(int i=0;i<=5;++i){
cin>>tmp;
ss.Push(tmp);
}
cout<<ss<<endl;
int tmp2;
ss.Pop(tmp2);
ss.Pop(tmp2);
cout<<ss<<endl;
system("pause");
return 0;
}