1. 程式人生 > >順序棧、鏈棧、順序佇列、鏈佇列區別

順序棧、鏈棧、順序佇列、鏈佇列區別

1.順序棧

順序棧的主要特徵是用一個數組實現棧的儲存,top指標確定棧頂元素位置

定義形式如下:

#define Max 100
template <class T>
class SeqStack{
public:
       SeqStack():top(-1){}
       void Push(T x);
        T getTop();
        T Pop();
        bool IsEmpty();
        bool IsFull();
        int getSize();
private:
       T A[Max];
       int top;
}


2.鏈棧

鏈棧的特點是在主體鏈棧類外定義一個結構體,來實現結點的儲存,在類中定義top指標,指向Node頭結點。

定義形式如下:

template <class T>
struct Node{
    T data;
    Node<T> *next;
};

template <class T>
class LinkedStack
{
public:
    LinkedStack(); 
    void Push(const T&x);
    T Pop();
    T getTop();
    bool IsEmpty()const{return (top->next==NULL)?true:false;}
    int getSize()const;
    void makeEmpty();
   
private:
    Node<T> *top;           //棧頂指標
};


3.順序佇列

佇列基於陣列的儲存表示稱為順序佇列,front指向隊首,隊首刪除元素,rear隊尾,隊尾新增元素。

但是單純的陣列表示,可能會造成浪費空間。

為了充分利用儲存空間,將陣列的前端front和後端rear連線起來,形成一個環形的表,稱為迴圈佇列。

迴圈佇列定義特徵是:

(1)利用陣列實現儲存。

(2)有兩個整數值作為指標功能,front指向隊首元素,rear指向隊尾元素的下一位,注意不是隊尾元素。

        實際上front、rear即為陣列第一個元素和最後一個元素下一位的下標。

(3)由於是迴圈佇列,每次刪除,或者新增元素,或者判斷佇列是否滿的時候,注意判別式的寫法

①刪除元素:front=(front+1)%Max;

②新增元素:rear=x;rear=(rear+1)%Max;

③判斷佇列是否滿:if((rear+1)%Max==front)  棧滿

④判斷佇列是否為空:if(rear==front) 棧空

⑤得到佇列長度:length=(rear-front+Max)%Max

⑥得到隊尾元素:注意不是data[rear]    而是data[rear-1]

迴圈佇列的定義形式如下:

template <class T>
class SeqQueue{
public:
    SeqQueue(){MakeEmpty();}
    void MakeEmpty();
    bool EnQueue(T x);
    bool DeQueue(T &x);
    T getFront();
    bool IsEmpty();
    bool IsFull();
    int getSize();
    T getRear();
private:
    T data[Max];
    int front_;
    int rear;
};


4.鏈佇列

鏈佇列不是用陣列實現儲存功能,而是定義一個結構體來表示結點,故不存在浪費空間,也不用考慮迴圈的問題

template <class T>
struct Node{
    T data;
    Node *next;
};
template <class T>
class LinkedQueue
{
public:
    LinkedQueue();
    ~LinkedQueue(){front_=rear=0;}
    T getFront();
    T getRear();
    void EnQueue(T x);
    void DeQueue();
    bool IsEmpty();
    int getSize();
  
private:
    Node<T> *front_,*rear;
};

下幾篇將給出具體的建立順序棧、鏈棧、順序佇列(迴圈佇列)、鏈佇列的程式碼