对于栈中支持的变量类型因为问题的不同,变量也不同。用类模板来改写stack可以方便的在不同变量间切换。
MyStack.h
#ifndef MyStack_h
#define MyStack_h
template <typename T>//类模板
class MyStack
{
public:
MyStack(int size);//分配内存初始化栈空间,设定容量
~MyStack();//回收内存
bool stackEmpty();//判空
bool stackFull();//判满
void ClearStack();//清空
int stackLength();//计算长度
bool push(T elem);//入栈,栈顶上升
bool pop(T &elem);//出栈,栈顶下降
void stackTraverse(bool isFrombottom);//遍历
private:
T *m_pbuffer;
int m_iSize;
int m_iTop;
};
template <typename T>
MyStack <T>::MyStack(int size)
{
m_iSize=size;
m_pbuffer = new T[size];
m_iTop=0;
}
template <typename T>
MyStack <T>::~MyStack()
{
delete []m_pbuffer;
}
template <typename T>
bool MyStack <T>::stackEmpty()
{
if(0==m_iTop)
{
cout<<"栈为空"<<endl;
return true;
}
else
return false;
}
template <typename T>
bool MyStack <T>::stackFull()
{
if(m_iTop==m_iSize)
return true;
else
return false;
}
template <typename T>
int MyStack <T>::stackLength()
{
return m_iTop;
}
template <typename T>
void MyStack <T>::ClearStack()
{
m_iTop=0;
}
template <typename T>
bool MyStack <T>::push(T elem)
{
if(stackFull())
{
return false ;
}
m_pbuffer[m_iTop]=elem;
m_iTop++;
return true;
}
template <typename T>
bool MyStack <T>::pop(T &elem)
{
if(stackEmpty())
return false;
else
m_iTop--;
elem=m_pbuffer[m_iTop];
return true;
}
template <typename T>
void MyStack <T>::stackTraverse(bool isFrombottom)
{
if(isFrombottom)
{
for(int i=0;i<=m_iTop;i++)
cout<<m_pbuffer[i];
//m_pbuffer[i].printCoordinate();
}
else
{for(int i=m_iTop-1;i>=0;i--)
cout<<m_pbuffer[i]<<",";
//m_pbuffer[i].printCoordinate();
}
}
#endif
demo.cpp
#include<iostream>
#include<stdlib.h>
#include"MyStack.h"
#include"Coordinate.h"
using namespace std;
/**********************************/
/*
栈类
要求:
MyStack(int size);//分配内存初始化栈空间,设定容量
~MyStack();//回收内存
bool stackEmpty();//判空
bool stackFull();//判满
void ClearStack();//清空
int stackLength();//计算长度
void push(char elem);//入栈,栈顶上升
char pop(char &elem);//出栈,栈顶下降
void stackTraverse();//遍历
*/
void main()
{
MyStack<Coordinate> *s=new MyStack<Coordinate>(5);
s->push(Coordinate(1,2));
s->push(Coordinate(3,4));
//s->ClearStack();
s->stackTraverse(true);
cout<<s->stackLength()<<endl;
s->stackEmpty();
if(s->stackFull())
{
cout<<"栈为满"<<endl;
}
delete s;
s=NULL;
system("pause");
}
Coordinate.h
#ifndef Coordinate_h
#define Coordinate_h
#include<ostream>
using namespace std;
class Coordinate
{
friend ostream &operator<<(ostream &out,Coordinate &coor);
public:
Coordinate(int x=0,int y=0);
~Coordinate();
void printCoordinate();
private:
int m_ix;
int m_iy;
};
#endif
Coordinate.cpp
#include"Coordinate.h"
#include<iostream>
using namespace std;
Coordinate::Coordinate(int x,int y)
{
m_ix=x;
m_iy=y;
}
Coordinate::~Coordinate()
{
}
void Coordinate::printCoordinate()
{
cout<<"("<<m_ix<<","<<m_iy<<")"<<endl;
}
ostream &operator<<(ostream &out,Coordinate &coor)
{
out<<"("<<coor.m_ix<<","<<coor.m_iy<<")"<<endl;
return out;
}