注意:1 注意模板的格式,声明文件和实现文件都放在头文件中,无法实现分离编译;
2 学会重载运算符和友元函数使用
#ifndef MYSTACK_H
#define MYSTACK_H
template <typename T>
class MyStack
{
public:
MyStack(){}
MyStack(int size); //分配栈空间
~MyStack();
bool stackEmpty();
bool stackFull();
void clearStack();
int stackLength();
bool push(T elem);
bool pop(T &elem);
void stackTraverse();
private:
T *m_pBuffer; //栈空间指针
int m_iSize; //栈容量
int m_iTop; //栈顶,栈中元素个数
};
template<typename T>
MyStack<T>::MyStack(int size){
m_iSize = size;
m_iTop = 0;
m_pBuffer = new T[size];
}
template<typename T>
MyStack<T>::~MyStack(){
delete[] m_pBuffer;
m_pBuffer = nullptr;
}
template<typename T>
bool MyStack<T>::stackEmpty(){
if (0 == m_iTop)
return true;
return false;
}
template<typename T>
bool MyStack<T>::stackFull(){
if (m_iTop == m_iSize)
return true;
return false;
}
template<typename T>
void MyStack<T>::clearStack(){
m_iTop = 0;
}
template<typename T>
int MyStack<T>::stackLength(){
return m_iTop;
}
template<typename T>
bool MyStack<T>::push(T elem){
if (stackFull())
return false;
m_pBuffer[m_iTop++] = elem;
return true;
}
template<typename T>
bool MyStack<T>::pop(T &elem){
if (stackEmpty())
return false;
m_iTop--;
elem = m_pBuffer[m_iTop];
return true;
}
template<typename T>
void MyStack<T>::stackTraverse(){
for (int i = 0; i < m_iTop; i++)
cout << m_pBuffer[i];
}
#endif
#ifndef COORDINATE_H
#define COORDINATE_H
#include<ostream>
using namespace std;
class Coordinate
{
friend ostream &operator<<(ostream &out, Coordinate &coor);
public:
Coordinate(){}
Coordinate(int x, int y);
void printCoordinate();
private:
int m_iX;
int m_iY;
};
#endif
#include"Coordinate.h"
#include<iostream>
using namespace std;
Coordinate::Coordinate(int x, int y) :m_iX(x), m_iY(y){
}
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;
}
#include<iostream>
#include"MyStack.h"
#include"Coordinate.h"
using namespace std;
/*
栈-类模板
要求:
将普通栈改造为类模板,使其可以适用于任何数据类型
目的:灵活掌握栈机制,理解抽象数据类型在栈中的应用
*/
int main(){
MyStack<Coordinate> *pStack = new MyStack<Coordinate>(4);
pStack->push(Coordinate(1, 2));
pStack->push(Coordinate(1, 3));
pStack->stackTraverse();
delete pStack;
pStack = NULL;
return 0;
}