<数据结构>静态队列基本功能实现


前言

提示:本篇主要是本小白大学期间对数据结构实验的一些基本代码功能实现,希望对一同数据结构的伙伴有所帮助。


提示:以下是本篇文章正文内容,下面案例可供参考

一、线性结构两种常见应用之一 —— 队列

定义:一种可以实现“先进先出“的存储结构
分类:链式队列——用链表实现			
静态链表——用数组实现(静态队列通常必须是循环队列)
主要算法:入队 出队
应用:所有与时间有关的操作都与队列有关

二、使用步骤

1.循环队列伪算法讲解

1.为什么要用循环队列?
答:无循环会造成假溢出

2.循环队列需要几个参数来确定?
答:两个;两个参数不同场合有不同含义
⑴对列初始化
	front 和 rear 的值为零
⑵队列非空
	front 代表的是队列第一个元素
	rear 代表的是队列的最后一个有效元素的下一个元素
⑶队列空
	front 和 rear 的值相等,不一定为零
	
3.循环队列入队算法思路
⑴将值存入rear所代表的位置
	错误算法:r=r+1;
	正确算法:r=(r+1)%数组长度
		
4.出队伪算法
答:f =(f+1)%数组长度

5.如何判断循环队列是否为空
答:如果front 与 rear值相等,则该队列一定为空

6.如何判断循环队列是否已满
答:两种方式
⑴多增加一个表标识参数
⑵少用一个元素(通常使用这种方式)
如果rear和front紧接着,则队列已满
if(rear+1%数组长度 == front)
{已满}else {没满}

提示:front的值可以比rear大,也可能比rear小,也可能相等

2.队列基本功能

如下(示例):

bool emput_queue(queue *PQ);
void traverse(queue *PQ,int num);
bool out_queue(queue *PQ, int *pval,int num);
bool full_queue(queue *PQ,int num);
bool en_queue(queue *PQ,int num);
void init(queue *PQ,int num);

2.代码功能实现

如下(示例):

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct queue
{
		int *Pbase;
		int front;
		int rear;
}queue;
		
		
extern bool emput_queue(queue *PQ);//判断队空
extern void traverse(queue *PQ,int num);//遍历
extern bool out_queue(queue *PQ, int *pval,int num);//出队
extern bool full_queue(queue *PQ,int num);//判断队满
extern bool en_queue(queue *PQ,int num);//入队
extern void init(queue *PQ,int num);//初始化
int main()
{
		int num;
		int pval;
		int function;
		queue PQ;
		
		printf("please tell me how many num did you want to input into queue:\n");
		scanf("%d",&num);
		init(&PQ,num);
		while(1)
		{
		printf("1.en_queue\t\t2.out_queue\n");
		printf("please input which function did you you choose;\n");
		scanf("%d",&function);//选择功能
		switch(function)
		{
		case 1 : en_queue(&PQ,num);
				 traverse(&PQ,num);
				 continue;

		case 2 : out_queue(&PQ,&pval,num);
				 traverse(&PQ,num);
				 printf("out a num: %d\n",pval);//输出出队的数据
				 continue;
		}
		}
		return 0 ;
		
}

void init(queue *PQ,int num)
{
		PQ->Pbase =(int *)malloc(sizeof(int)*num);//分配数组空间
		PQ->front = 0;
		PQ ->rear = 0;
		return ;
}

bool en_queue(queue *PQ,int num)
{

		if(full_queue(PQ,num))//判断队满
		{
				printf("full_queue\n");
				return false;
		}
		else
		{
		int val;
		printf("please input  a num :");
		scanf("%d",&val);//输入要入队的数值
		PQ->Pbase[PQ->rear]=val;//赋值
		PQ->rear=(PQ->rear+1)%num;//OQ->rear+1
		return true;
		}
}

bool full_queue(queue *PQ,int num)
{
		if((PQ->rear+1)%num == PQ->front)
		{
				return true;
		}
		else
		{
				return false;
		}
}

bool out_queue(queue *PQ, int *pval,int num)
{
		if(emput_queue(PQ))//判断队空
		{
				return false;
		}
		else
		{
				*pval = PQ->Pbase[PQ->front];//顶端数值赋给pval
				PQ->front = (PQ->front+1)%num;//取出front(底端)数据
				return true;
		}
}
bool emput_queue(queue *PQ)
{
		if(PQ->rear == PQ->front)
		{
				printf("NO num now\n");
				return true;
		}
		else
		{
				return false;
		}
}
void traverse(queue *PQ,int num)
{
		int i = PQ->front;
		while(i != PQ->rear)//未到队尾
		{
				printf("%d\t",PQ->Pbase[i]);
				i=(i+1)%num;
		}
		putchar('\n');
		return ;
}


总结

提示:这里对文章进行总结:
例如:本篇主要是对静态队列的基本功能代码实现,主要是为了判断队空和队满,算法中引入了取余操作比较新颖,读者可以结合书中循环队列图分析,再对照功能代码,逻辑理解后,对队列的认识就会清晰许多。

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页