队列的顺序存储结构和链式存储结构

        队列也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。

一、队列的顺序存储形式

一般队列的顺序存储结构运用的是循环队列,在编写程序之前,需要了解循环队列的相关计算。

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

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

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

队头指针进1:Q.front=(Q.front+1)%MaxSize

队尾指针进1:Q.rear=(Q.rear+1)%MaxSize

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

基础代码如下所示:

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct     //队列的顺序存储结构
{
	int data[MaxSize];   //存放队列元素
	int front, rear;   //队头指针和队尾指针
}SqQueue;

void Init(SqQueue& Q)  //初始化队列
{
	Q.front = Q.rear = 0;   //是0不是空
}
	
bool IsEmpty(SqQueue Q)  //判队空
{
	if (Q.front == Q.rear)
		return true;
	else
		return false;
}

bool Enter(SqQueue& Q, int x)  //入队
{
	if ((Q.rear + 1) % MaxSize == Q.front)  //判断队列是否为满
		return false;
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1) % MaxSize;
	return true;
}

bool Out(SqQueue& Q)   //出队
{
	if (Q.front == Q.rear)   //判断队列是否为空
		return false;
	int x = Q.data[Q.front];
	printf("%4d", x);
	Q.front = (Q.front + 1) % MaxSize;
	return true;
}

int main() {
	SqQueue Q;
	Init(Q);
	int x=0,i=0;
	printf("输入一串数据,以“-99999”结束:");
	while (x != -99999) {
		scanf_s("%d", &x);
		Enter(Q, x);
		i++;            //i记录队列中数据元素个数
	}
	printf("\n出队:");
	for(int j=0;j<i-1;j++)    //队列中的数据依次出队
		Out(Q);
}

结果如下:

 

二、队列的链式存储结构

队列的链式存储结构的主要思想,正是带表头结点的单链表

与顺序存储不一样的是:

顺序存储中,front指向第一个值,而rear指向最后一个值的后一个位置;

链式存储中,front指向头结点,rear指向最后一个结点。

以下简单地给出队列链式存储的初始化,判队空,进出队的操作。

基础代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode   //链式队列结点
{   
	int data;
	struct LinkNode* next;
}LinkNode;
typedef struct     //链式队列
{
	LinkNode* front, * rear;
}LinkQueue;

void Init(LinkQueue &Q)   //队列初始化
{
	Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));  //创建头结点
	Q.front->next = NULL;
}

bool IsEmpty(LinkQueue Q)   //判队空
{
	if (Q.front == Q.rear)
		return false;
	else
		return true;
}

void Enter(LinkQueue& Q,int x)    //入队
{
	LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
	s->data = x; s->next = NULL;
	Q.rear->next = s;
	Q.rear = s;
}

bool Out(LinkQueue& Q)   //出队
{
	if (Q.front == Q.rear)
		return false;
	LinkNode* p = Q.front->next;
	int x = p->data;
	printf("%4d", x);      
	Q.front->next = p->next;
	if (Q.rear == p)     //若队列中只有一个结点,删除后变空
		Q.rear = Q.front;
	free(p);
	return true;
}

int main() {
	LinkQueue Q;
	Init(Q);
	int x=0,i=0;
	printf("输入一串数据,以“-99999”结束:");
	while (x != -99999) {
		scanf_s("%d", &x);
		Enter(Q, x);
		i++;            //i记录队列中数据元素个数
	}
	printf("\n出队:");
	for(int j=0;j<i-1;j++)    //队列中的数据依次出队
		Out(Q);
}

结果如下:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值