前言
队列是一种先进先出的线性表。队列也有两种存储结构,这一篇我们来谈谈队列的顺序存储结构
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;
}
运行结果
后记
以上就是顺序栈的表示和各种操作,喜欢的多多支持喔~