1. 程式人生 > >資料結構之棧模板實現(3)

資料結構之棧模板實現(3)

注意: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;
}