顺序栈、链栈、顺序队列、链队列区别

来源:互联网 发布:如何购买网络域名 编辑:程序博客网 时间:2024/06/11 14:43

1.顺序栈

顺序栈的主要特征是用一个数组实现栈的存储,top指针确定栈顶元素位置

定义形式如下:

#define Max 100template <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;};
下几篇将给出具体的创建顺序栈、链栈、顺序队列(循环队列)、链队列的代码

0 0
原创粉丝点击