順序棧、鏈棧、順序佇列、鏈佇列區別
阿新 • • 發佈:2019-01-06
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;
};
下幾篇將給出具體的建立順序棧、鏈棧、順序佇列(迴圈佇列)、鏈佇列的程式碼