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

本文介绍了数据结构中的四种类型:顺序栈、链栈、顺序队列(循环队列)和链队列。顺序栈使用数组存储,通过top指针确定栈顶;链栈借助结构体存储节点,top指针指向头结点;顺序队列基于数组,循环队列解决了空间浪费问题,通过front和rear指针管理;链队列不使用数组,通过结构体定义节点避免空间浪费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
};

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值