数据结构与算法(七)

本文介绍了链式存储结构的队列实现,包括带头结点和不带头结点的初始化、入队、出队操作,并讨论了队列满的条件。此外,还讲解了双端队列的概念及其与栈和普通队列的区别,强调了双端队列在插入和删除操作上的灵活性。
摘要由CSDN通过智能技术生成

目录

1.队列的链式存储结构

1)初始化

2)入队

3)出队

4)队列满的条件

2.双端队列


1.队列的链式存储结构

1)初始化

主要分为带头结点的不带头结点的

typedef struct LinkNode{

ElemType data;

struct LinkNode *next;

}LinkNode;

//初始化队列(带头结点)

void InitQueue(LinkQueue &Q){
//初始时 front,rear 都指向头结点

Q.front=Q.rear= (LinkNode *) malloc(sizeof(LinkNode)); 

Q.front->next=NULL;

}

void testLinkQueue() {

LinkQueue Q;  //声明一个队列

InitQueue(Q);  //初始化队列
}

//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{
if(Q.front=Q.rear)
    return true;
else
    return false;
}
//初始化队列(不带头结点)

void InitQueue(LinkQueue &Q){
//初始时 front,rear 都指向头结点

Q.front=NULL;
Q.rear=NULL;

}

//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{
if(Q.front=NULL)
    return true;
else
    return false;
}

2)入队

//新元素入队(带头结点)
​bool EnQueue(LinkQueue &Q,ElemType x)
{
LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q.rear->next=s;  //新结点插入到rear之后
Q.rear=s;   //修改表尾指针
}

当不带头结点时,第一个元素入队时需要特别处理

//新元素入队(不带头结点)
​bool EnQueue(LinkQueue &Q,ElemType x)
{
    LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
    s->data=x;
    s->next=NULL;
    if(Q.front ==NULL)
    {//在空队列中插入第一个元素
        Q.front = s; //修改队头队尾指针
        Q.rear=s;  
    else
    {
        Q.rear->next=s;  //新结点插入到rear之后
        Q.rear=s;   //修改rear指针
    }
}

3)出队

//队头元素出队(带头结点)​
bool DeQueue(SqQueue &Q,ElemType &x)
{
 
if(​Q.rear==Q.front)
    return false;   //队空
LinkNode *p=Q.front->next;
x=p->data;    //用变量x返回队头元素
Q.front->next=p->next;  //修改头结点的next指针
if(Q.rear==p)   //此次是最后一个结点出队
    Q.rear==Q.fron;  //修改rear指针
free(p);   //释放结点空间
​return true;
}

 当不带头结点时,最后一个元素出队时需要特别处理

rear-->NULL     front-->NULL

//队头元素出队(不带头结点)​
bool DeQueue(SqQueue &Q,ElemType &x)
{
 
if(​Q.front==NULL)
    return false;   //队空
LinkNode *p=Q.front;  //p指向此次出对的结点
x=p->data;    //用变量x返回队头元素
Q.front=p->next;  //修改front指针
if(Q.rear==p){   //此次是最后一个结点出队
    Q.rear=NULL;
    Q.fron=NULL; 
} //修改rear指针
free(p);   //释放结点空间
​return true;
}

4)队列满的条件

顺序存储  ----  预分配的空间耗尽时队满

链式存储  ----  一般不会队满,除非内存不足

2.双端队列

栈:只允许从一端插入和删除的线性表

队列:只允许从一端插入,另一端删除的线性表

双端队列:只允许从两端插入,两端删除的线性表

输入受限的双端队列:只允许从一端插入,两端删除的线性表

输出受限的双端队列:只允许从两端插入,一端删除的线性表

主要考察方向为:判断输出队列的合法性

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值