C Language 栈和队列 - 顺序队列(七)

前言:最开始的顺序队列中的顺序存储结构设计比较单一,导致出现队列中出现假溢出这样的情况,判断条件为:当front与rear相等时,

在这里插入图片描述

  • 创建结构体
struct SqQueue{
	int data[MaxSize];
	int fornt,rear;
};

-初始化队列算法:

//初始化
void initQueue(SqQueue *&s){
	
	s = (SqQueue *)malloc(sizeof(SqQueue));
	s->fornt=s->rear=-1;
	
} 
  • 创建队列算法:
//创建队列
void createQueue(SqQueue *&s){
	int num = 5;
	
	while(num >= 0){
		s->rear = s->rear + 1;
		s->data[s->rear] = num--;
	}
} 
  • 出队算法:
//出队
void outOfQueue(SqQueue *s){
	while(s->fornt != s->rear){
		s->fornt = s->fornt + 1;
		printf("%3d",s->data[s->fornt]);
	}
} 
  • 销毁队列算法:
//销毁队列
void destoryQueue(SqQueue *&s){
	free(s);
	printf("\n释放完毕");
} 
  • 运行结果如下:

在这里插入图片描述

(二)环形队列

根据最初的队列来看,发现之前的队列的定义方式出现了假溢出的问题,那我们可以使用环形队列来解决这个问题。

  • 创建和定义结构体
#define MaxSize 6

struct SqQueue{
	int data[MaxSize];
	int front , rear;
};
  • 创建环形队列算法:
//创建环形队列
void createQueue(SqQueue *&s){
	
	if(((s->rear + 1) % MaxSize) == (s->front % MaxSize)){
		printf("队列已满");
		exit(1);
	}
	
	while(((s->rear + 1) % MaxSize) != (s->front % MaxSize))
	{
		s->rear = s->rear + 1;
		s->data[s->rear] = s->rear;
	}
}

补充:这里主要改进的地方是,牺牲一个元素空间用来判断队满队空的标志,也是在环形队列中最为常用的方法,所以这里环形队列中的元素是从下标位1开始到n-1个元素

在这里插入图片描述
如图所示,rear指针和front指针初始化是指向0位置的,入队的时候是从下一个位置开始入队,出队也是一样

  • 出队算法:
//环形队列出队
void outOfQueue(SqQueue *s){
		
		if((s->rear) % MaxSize == s->front % MaxSize){
				printf("队列为空"); 
				exit(1);
		}
		
		while((s->front) % MaxSize != (s->rear % MaxSize)){
			s->front = s->front + 1; 
			printf("%3d",s->data[s->front]);
		}
		printf("\n出队完毕!\n");
} 

  • 最终结果展示:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值