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

1.顺序栈

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

定义形式如下:

 

#define Max 100
template 
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 
struct Node{
    T data;
    Node *next;
};

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

下几篇将给出具体的创建顺序栈、链栈、顺序队列(循环队列)、链队列的代码
 

 

你可能感兴趣的:(算法)