0
点赞
收藏
分享

微信扫一扫

03(数据结构考研)队列相关操作代码


文章目录

  • ​​:heart:队列的顺序实现:heart:​​
  • ​​:heart:循环队列的入队操作:heart:​​
  • ​​:heart:循环队列的出队操作:heart:​​
  • ​​:heart:队列的链式实现:heart:​​

❤️队列​的​顺序​实现❤️

#include <stdio.h>
#define MAXSIZE 10//队列元素的最大个数
//顺序队列的描述
typedef struct {
ElemType data[MAXSIZE];//静态数组存放队列元素
int front,rear;//队头指针,队尾指针
}sqQueue;

//初始化一个队列
void InitQueue(sqQueue &Q){
Q.rear=Q.front=0;//初始化时,队尾指针指向队头指针
}

//判断队列是否为空
bool QueueEmpty(sqQueue &Q){
if(Q.rear==Q.front)//对空条件
return true;
else
return FALSE;
}

int main()
{
//声明一个队列
sqQueue Q;
//初始化一个队列
InitQueue(Q);
//判断队列是否为空
QueueEmpty(Q);
return 0;
}

❤️循环队列的入队操作❤️

  • 顺序队列在队列满的情况下容易发生假溢出的情况,所以引入了循环队列
  • 顺序队列满的条件无法代码表示,所以我们引入了模运算的方式进行的表示。
  • 队列满:​​(Q.rear+1)%MAXSIZE==Q.front​
  • 顺序队列–>(抽象成)循环队列:​​Q.rear=(Q.rear+1)%MAXSIZE​​,这里采用的是队尾指针加1取模,使得顺序队列的存储空间在逻辑上变成了“环状”,也就形成了循环队列
    这里需要解释一下,这是取余操作的神奇之处,奇妙之处。设定总事件为5,分别为0,1,2,3,4。这5个小事件分别对5取余操作,最后得到的结果只会在0,1,2,3,4之间进行循环,利用取余循环的特征,我们可以使得原本的顺序队列在存储空间逻辑上变成循环的环状。
  • 03(数据结构考研)队列相关操作代码_循环队列

#include <stdio.h>
typedef struct {
ElemType data[MAXSIZE];//静态数组存放队列元素
int front,rear;//队头指针,队尾指针
}sqQueue;

//入队操作
bool EnQueue(sqQueue &Q,ElemType e){
if((Q.rear+1)%MAXSIZE==Q.front)
return FALSE;//队满则报错
Q.data[Q.rear]=x;//新元素插入队尾
Q.rear=(Q.rear+1)%MAXSIZE;//队尾指针加1
return true;
}

int main()
{
//声明一个队列
sqQueue Q;
//初始化一个队列
InitQueue(Q);
//判断队列是否为空
QueueEmpty(Q);
//入队操作
EnQueue(Q,x);
return 0;
}

❤️循环队列的出队操作❤️

#include <stdio.h>
typedef struct {
ElemType data[MAXSIZE];//静态数组存放队列元素
int front,rear;//队头指针,队尾指针
}sqQueue;


//出队操作
bool DeQueue(sqQueue &Q,ElemType &x){
if(Q.rear==Q.front)
return FALSE;
x=Q.data[Q.front];
Q.front=(Q.front+1)%MAXSIZE;//把这个删了就可以获得队头元素
return true;
}

//

int main()
{
//声明一个队列
sqQueue Q;
//初始化一个队列
InitQueue(Q);
//判断队列是否为空
QueueEmpty(Q);
//入队操作
EnQueue(Q,x);
//出队操作
DeQueue(Q,x);
return 0;
}

❤️队列的链式实现❤️

#include <stdio.h>
#include <cstdlib>

//队列的链式存储类型
typedef struct {//链式队列的结点
ElemType data;
struct LinkNode *next;
}LinkNode;

typedef struct {//链式队列
LinkNode *front,*rear;//队列的头指针和尾指针
}LinkQueue;
//=====================队列的基本操作============================

//队列的初始化
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode));//建立头结点
Q.front->next=null;//初始化为空
}

//判断队空
bool IsEmpty(LinkQueue Q){
if(Q.rear==Q.front)//队列为空的条件
return true;
else
return false;
}

//入队操作
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
s->next=null;//创建新节点,把数据插入到链尾
Q.rear->next=s;
Q.rear=s;
}

//出队操作
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.rear==Q.front)
return false;//空队操作
LinkNode *p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return true;
}

int main() {

return 0;
}


举报

相关推荐

0 条评论