1. 程式人生 > >c++堆疊類模板實現

c++堆疊類模板實現

最近在複習資料結構,涉及到堆疊的實現,通過類模板可以使堆疊的儲存資料型別更為靈活,下面是堆疊的實現程式碼:

#ifndef MYSTACK_H
#define MYSTACK_H
#include <iostream>
using namespace std;

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);//出棧
	bool stackTop(T &elem);//返回棧頂
	void stackTranverse();//遍歷棧

private:
	T *m_pStack;//棧指標
	int m_iSize;//棧容量
	int m_iTop;//棧頂
};

template <typename T>
MyStack<T>::MyStack(int size)
{
	m_iSize = size;
	m_pStack = new T[m_iSize];
	m_iTop = 0;
}
template <typename T>
MyStack<T>::~MyStack()
{
	delete m_pStack;
	m_pStack = NULL;
}
template <typename T>
bool MyStack<T>::stackEmpty() {//判空
	return m_iTop == 0 ? true : false;
}
template <typename T>
bool MyStack<T>::stackFull() {//判滿
	return m_iTop == m_iSize ? true : 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;
	}
	else {
		m_pStack[m_iTop++] = elem;
		return true;
	}
}
template <typename T>
bool MyStack<T>::pop(T &elem) {//出棧
	if (stackEmpty())
	{
		return false;
	}
	else {
		elem = m_pStack[--m_iTop];
		return true;
	}
}
template <typename T>
bool MyStack<T>::stackTop(T &elem) {//返回棧頂元素
	if (stackEmpty())
	{
		return false;
	}
	else {
		elem = m_pStack[m_iTop-1];
		return true;
	}
}
template <typename T>
void MyStack<T>::stackTranverse() {//遍歷棧
	int i = 0;
	for (i = 0; i < m_iTop; i++) {
		cout << m_pStack[i];
	}
}
#endif

其中需要注意的是類模板需要在每個函式之前寫上模板定義template <typename T>,並且將類名寫成MyStack<T>,函式中涉及到類的使用時用T代替即可。

接著我用一個座標點類Coordinate來做測試:

在Coordinate類中利用函式過載運算子<<實現座標點的列印

#include <ostream>
using namespace std;

class Coordinate
{
public:
	friend ostream& operator<<(ostream &out, Coordinate &coor);
	Coordinate(int x=0,int y=0)
	{
		m_iX = x;
		m_iY = y;
	}

	~Coordinate()
	{
	}
private:
	int m_iX;
	int m_iY;
};
ostream& operator<<(ostream &out, Coordinate &coor) {
	out << "(" << coor.m_iX << "," << coor.m_iX << ")" << endl;
	return out;
}

下面是測試主函式:

#include <iostream>
#include "MyStack.h"
#include "Coordinate.h"
using namespace std;

int main() {
	MyStack<Coordinate> *pStack = new MyStack<Coordinate>(5);

       pStack->push(Coordinate(3, 5));//座標點入棧
	pStack->push(Coordinate(7, 5));
	pStack->push(Coordinate(6, 5));
	pStack->push(Coordinate(4, 5));
	pStack->push(Coordinate(3, 5));
	
	pStack->stackTranverse();//遍歷棧
	Coordinate t;
	pStack->pop(t);//出棧
	cout <<"彈出的t為:"<< t ;
	cout << "長度:" << pStack->stackLength();
	pStack->clearStack();//清空棧
	pStack->stackTranverse();

       //delete pStack;
	//pStack = NULL;

	system("pause");
	return 0;
}