数据结构之队列的顺序存储结构 C语言版

前言

队列是一种先进先出的线性表。队列也有两种存储结构,这一篇我们来谈谈队列的顺序存储结构

1.队列的作用

操作系统方面:鼠标的运用
客服排队方面:排队等候
键盘方面:从键盘输入到显示器的输出

2.队列的表示形式

用数组表示队列,为了出队不影响大量元素,所以出队移动front指针,入队移动rear指针。但是这还造成了一个问题:假溢出
假溢出
于是就想出了一种方法,队列的顺序存储让它用循环队列的方式实现

3.用循环队列表示

如果用循环队列,那么有三个问题:判断队满的条件,判断队空的条件和队列的长度
当队列满时,我们修改其条件,保留一个元素空间。就是说还有一个空闲元素时,我们就认为队满了

1.判断队满的条件
(rear+1)%M == front
取模的目的是为了整合rear与front大小为一个问题
队满
2.判断队空的条件:
front == rear;
3.计算队列的长度:
(rear-front+M)%M

4.循环队列的定义

typedef struct
{
	QElemType data[M];
	int front;
	int rear;
}SqQueue;

5.内容布局

本篇主要包括了循环链表的入队,出队,还包括初始化,遍历,清空等操作
1.入队:

Q->data[Q->rear] = x;
Q->rear = (Q->rear+1)%M;//指针后移,若到最后则转到数组头部

2.出队:

e = Q->data[Q->front];
Q->front = (Q->front+1)%M;

代码如下

/*
程序名称:链栈的建立与基本操作
编译环境:vs2010
最后修改:2019.8.2
作者:xuan
*/
#include<stdio.h>
#include<stdlib.h>

#define M 5
#define OK 1
#define ERROR 0
typedef int Status;
typedef int QElemType;

//定义循环队列
typedef struct
{
	QElemType data[M];
	int front;
	int rear;
}SqQueue;

Status InitQueue(SqQueue *Q);//初始化循环队列
Status EnQueue(SqQueue *Q);//入队
Status DeQueue(SqQueue *Q);//出队
Status Display(SqQueue *Q);//显示
Status Clear(SqQueue *Q);//置空

int main()
{
	Status i;
	SqQueue Q;
	int n=0;
	InitQueue(&Q);
	while(n!=-1)
	{
		printf("						\n");
		printf(" 1.入队 2.出队 3.清空队 -1.退出 \n");
		scanf("%d",&n);
		switch(n)
		{
		case 1:
			i = EnQueue(&Q);
			if(i == ERROR)
				printf("失败\n");
			Display(&Q);
			break;
		case 2:
			i = DeQueue(&Q);
			if(i == ERROR)
				printf("失败\n");
			Display(&Q);
			break;
		case 3:
			Clear(&Q);
			printf("操作后的顺序栈:\n");
			Display(&Q);
			break;
		}
	}
	return 0;
}

//初始化循环队列
Status InitQueue(SqQueue *Q)
{
	Q->front = 0;
	Q->rear = 0;
	return OK;
}

//入队
Status EnQueue(SqQueue *Q)
{
	QElemType x = 0;
	if((Q->rear+1)%M == Q->front)//队满
		return OK;
	printf("请输入数据,-1时停止\n");
	while(x != -1)
	{
		scanf("%d",&x);
		if(x != -1)
		{
			Q->data[Q->rear] = x;
			Q->rear = (Q->rear+1)%M;//rear指向后一位,若到末尾则指向头部
		}
	}
	return OK;
}

//出队
Status DeQueue(SqQueue *Q)
{
	QElemType e;
	if(Q->front == Q->rear)//队空
		return ERROR;
	e = Q->data[Q->front];
	Q->front = (Q->front+1)%M;
	printf("出队的元素为:%d\n",e);
	return OK;
}

//显示
Status Display(SqQueue *Q)
{
	int size=0,i=0;
	size = (Q->rear-Q->front+M)%M;
	for(i=Q->front;i!=Q->rear;)
	{
		printf("%d ",Q->data[i]);
		i = (i+1)%M;
	}
	printf("\n");
	printf("队列的长度为:%d\n",size);
	return OK;
}

//置空
Status Clear(SqQueue *Q)
{
	Q->front = Q->rear;
	return OK;
}

运行结果

运行结果

后记

以上就是顺序栈的表示和各种操作,喜欢的多多支持喔~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值