链队列c语言怎么存储字母,队列的顺序存储与链式存储c语言实现-博客

一. 队列

1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表。

2.循环队列:把存储队列的顺序队列在逻辑上视为一个环。

71c09c64567a4fc25e0a3b204790849b.png

循环队列状态:

初始时:Q.front=Q.rear=0

front指针移动:Q.front=(Q.front+1)%MaxSize

rear指针移动:Q.rear=(Q.rear+1)%MaxSize

队列长度:(Q.rear+MaxSize-Q.front)%MaxSize

队空条件:Q.front=Q.rear

队满条件:Q.front=Q.rear

3.区分队空和队满的三种处理

1)牺牲一个存储单元来区分队空和队满

队满条件:(Q.rear+1)%MaxSize=Q.front

队空条件:Q.front=Q.rear

队中元素个数:(Q.rear+MaxSize-Q.front)%MaxSize

2)类型中增设表示元素个数的数据成员

队空条件:Q.front=Q.rear && Q.size=0

队满条件:Q.front=Q.rear && Q.size=MaxSize

3)类型中增设tag数据成员,以区分队空还是队满

tag=0时,若因删除导致Q.front=Q.rear,则为队空

tag=1时,若因插入导致Q.front=Q.rear,则为队满

二. 循环队列的顺序存储操作

1.结构描述

typedef structQueue{

ElemType data[MaxSize];intfront,rear,size;

}Queue;

2.初始化队列

Queue InitQueue()

{

Queue Q;

Q.front=Q.rear=Q.size=0;returnQ;

}

3.判断队列是否为空

intQueue_Empty(Queue Q)

{if(Q.front==Q.rear&&Q.size==0)returnTRUE;else

returnFALSE;

}

4.判断队列是否为满

intQueue_Full(Queue Q)

{if(Q.front==Q.rear&&Q.size==MaxSize)returnTRUE;else

returnFALSE;

}

5.入队

int InQueue(Queue *q)

{if(Queue_Full(*q))returnFALSE;

ElemType x;

printf("输入入队元素:");

scanf("%d",&x);

q->data[q->rear]=x;

q->rear=(q->rear+1)%MaxSize;

q->size++;returnTRUE;

}

6.出队

int OutQueue(Queue *q,ElemType *x)

{if(Queue_Empty(*q))returnFALSE;*x=q->data[q->front];

q->front=(q->front+1)%MaxSize;

q->size--;returnTRUE;

}

7.完整代码

15869a00d9dc888e9ed384402952d129.gif

9e173adc1dd5e0b5696bf300ed9941b0.gif

#include #include

#define TRUE 1

#define FALSE 0

#define MaxSize 10typedefintElemType;

typedefstructQueue{

ElemType data[MaxSize];intfront,rear,size;

}Queue;

Queue InitQueue();//初始化队列

int Queue_Empty(Queue Q);//判断队列是否为空 ,用size来判断空还是满

int Queue_Full(Queue Q);//判断队列是否满

int InQueue(Queue *q);//入队

int OutQueue(Queue *q,ElemType *x);//出队,并记录出队元素

intmain()

{

ElemType x;

Queue Q=InitQueue();

InQueue(&Q);

InQueue(&Q);

InQueue(&Q);

InQueue(&Q);

printf("此时队列长度:%d\n",Q.size);return 0;

}

Queue InitQueue()

{

Queue Q;

Q.front=Q.rear=Q.size=0;returnQ;

}intQueue_Empty(Queue Q)

{if(Q.front==Q.rear&&Q.size==0)returnTRUE;else

returnFALSE;

}intQueue_Full(Queue Q)

{if(Q.front==Q.rear&&Q.size==MaxSize)returnTRUE;else

returnFALSE;

}int InQueue(Queue *q)

{if(Queue_Full(*q))returnFALSE;

ElemType x;

printf("输入入队元素:");

scanf("%d",&x);

q->data[q->rear]=x;

q->rear=(q->rear+1)%MaxSize;

q->size++;returnTRUE;

}int OutQueue(Queue *q,ElemType *x)

{if(Queue_Empty(*q))returnFALSE;*x=q->data[q->front];

q->front=(q->front+1)%MaxSize;

q->size--;returnTRUE;

}

View Code

运行示例:

9221b2674b5650d09d6bc75471afad79.png

三. 队列的链式存储

链队列:同时带有队头指针和队尾指针的单链表。

b5ed0df07052971395fbd24c6f115595.png

1.结构描述

typedef structNode{

ElemType data;struct Node *next;

}Node;

typedefstructQueue{struct Node *front,*rear;

}Queue;

2.链队列初始化

Queue InitQueue()

{

Queue Q;

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

Q.front->next=NULL;returnQ;

}

3.判断队列是否为空

intQueue_Empty(Queue Q)

{if(Q.front==Q.rear)returnTRUE;else

returnFALSE;

}

4.入队

void InQueue(Queue *q)

{

ElemType x;

printf("输入入队元素:");

scanf("%d",&x);

Node*p=(Node*)malloc(sizeof(Node));

p->data=x;

p->next=NULL;

q->rear->next=p;

q->rear=p;

}

5.出队

int OutQueue(Queue *q,ElemType *x)

{if(Queue_Empty(*q))

{returnFALSE;

}

Node*p=q->front->next;*x=p->data;

q->front->next=p->next;if(q->rear==p)

{

q->rear=q->front;

}free(p);returnTRUE;

}

6.完整代码

15869a00d9dc888e9ed384402952d129.gif

9e173adc1dd5e0b5696bf300ed9941b0.gif

#include #include

#define TRUE 1

#define FALSE 0typedefintElemType;

typedefstructNode{

ElemType data;struct Node *next;

}Node;

typedefstructQueue{struct Node *front,*rear;

}Queue;

Queue InitQueue();//链队列初始化

int Queue_Empty(Queue Q);//判断队列是否为空

void InQueue(Queue *q);//入队

int OutQueue(Queue *q,ElemType *x);//出队

intmain()

{

ElemType x;

Queue Q=InitQueue();

InQueue(&Q);

InQueue(&Q);

InQueue(&Q);

OutQueue(&Q,&x);

printf("出队元素:%d\n",x);return 0;

}

Queue InitQueue()

{

Queue Q;

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

Q.front->next=NULL;returnQ;

}intQueue_Empty(Queue Q)

{if(Q.front==Q.rear)returnTRUE;else

returnFALSE;

}void InQueue(Queue *q)

{

ElemType x;

printf("输入入队元素:");

scanf("%d",&x);

Node*p=(Node*)malloc(sizeof(Node));

p->data=x;

p->next=NULL;

q->rear->next=p;

q->rear=p;

}int OutQueue(Queue *q,ElemType *x)

{if(Queue_Empty(*q))

{returnFALSE;

}

Node*p=q->front->next;*x=p->data;

q->front->next=p->next;if(q->rear==p)

{

q->rear=q->front;

}free(p);returnTRUE;

}

View Code

运行示例:

0c502c943fbf08891a7a18d09e37187b.png

本帖子中包含资源

您需要 登录 才可以下载,没有帐号?立即注册

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值