1. 程式人生 > >實現stack 和queue--模板類、容器介面卡

實現stack 和queue--模板類、容器介面卡

實現stack:

在實現棧的時候,我們都是在順序表上的特定位置插入刪除資料,那麼在學習了模板類和容器介面卡的概念後,就可以很容易的實現棧了。

關於模板:https://blog.csdn.net/weixin_40417029/article/details/80345464

//stack
#pragma once                                                                                                                         
#include <iostream>
#include "./vector.h"
#include "vector.cpp"    //為什麼要包含vector.cpp檔案呢?
using namespace std;

template <class T, class Container=Vector<T> >
class Stack
{
public:
    void Push(T x)
    {   
        _con.PushBack(x);
        return;
    }   
    void Pop()
    {   
        _con.PopBack();
        return;                                                                                                                      
    }
    const T& Top()
    {
        return _con.Back();
    }
    int Empty()
    {
        return _con.Size() == 0 ? 1 : 0;
    }

protected:
    Container _con;
};

上面是我利用vector類實現的stack類,我為什麼要在該檔案中包含vector.cpp檔案呢?

答:因為我的Vector類(https://blog.csdn.net/weixin_40417029/article/details/80351865)的函式定義與宣告是分離的。在構建時會出現“error LNK2019: 無法解析的外部符號 ”的錯誤。在Linux作業系統下會出現下面的錯誤:


要解決這樣的問題,除了我使用的方法外,還可以使用:

  • 第一種方法,就是把類模板中成員函式的宣告和定義都放在類的定義中(.h檔案),不要分開就行。
  • 第二種方法,在主檔案(main檔案)中既包含類模板的宣告檔案(介面檔案)(.h檔案),同時也包含類模板的實現檔案(.cpp檔案)就行了。
  • 第三種方法,在類的定義中(.h檔案)的最後包含類模板的實現檔案(.cpp檔案)。

 原因在於模板類和模板函式在使用的時候才會被例項化。當模板被使用時,編譯器需要函式所有的實現程式碼,來用合適的型別(模板引數)去構建正確的函式。但是如果將函式實現在單獨的原始檔中,這些檔案是不可見的,因而會出錯。

實現queue:

同樣的實現佇列也要這樣做:

//queue
#pragma once                                                                                                                         
#include "List.h"
#include "List.cpp"
template<class T, class Container=List<T> >
class Queue
{
public:
    void Push(T x)
    {   
        _con.PushBack(x);
    }   
    void Pop()
    {   
        _con.PopFront();
    }   
    int Size()
    {   
        _con.Size();
    }                                                                                                                                
    T& Front()
    {
        return _con.Front() -> _data;
    }
protected:
    Container _con;
};