首页 > 其他分享 >数据结构 顺序队列(计数器版)

数据结构 顺序队列(计数器版)

时间:2024-08-12 10:25:37浏览次数:13  
标签:队列 type queue front 计数器 extern 数据结构 data ptr

在实现循环队列时,为了区分队列为空和队列满的情况,我们通常会浪费一个位置。也就是说,如果队列的总容量是100,那么实际上只能存储99个元素。这是因为我们需要保留一个位置来判断队列是满的还是空的。如果我们不这样做,那么在队列满和队列空时,frontrear 指针都会指向同一个位置,这将导致无法区分这两种状态。

解决方法:增加一个计数器

增加一个额外的变量来记录队列中当前元素的数量,以达到区分队列满和队列空。

头文件

​
#pragma once
#define MAX 100
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
typedef int data_type;
typedef struct {
	data_type element[MAX];
	int front, rear, count;
}queue, * queue_ptr;
extern void queue_ini(queue_ptr p);
extern void print_queue(queue_ptr p);
extern int is_empty(queue_ptr p);
extern int is_full(queue_ptr p);
extern data_type in_queue(queue_ptr p, data_type data);
extern data_type out_queue(queue_ptr p);
extern data_type get_front(queue_ptr p);

​

源文件

#include "Lk.h"
void queue_ini(queue_ptr p)
{
	p->front = p->rear = p->count = NULL;
}

int is_empty(queue_ptr p)
{
	return (p->count==0) ? 1 : 0;//empty 1
}

int is_full(queue_ptr p)
{
	return (p->count==MAX) ? 1 : 0;//full 1
}

data_type in_queue(queue_ptr p, data_type data)
{
	if (is_full(p))return -1;
	else {
		p->element[p->rear] = data;
		p->rear = (p->rear + 1) % MAX;
		printf("%d已入队\n", data);
		p->count++;
	}
	return data;
}

data_type out_queue(queue_ptr p)
{
	if (is_empty(p))return -1;
	else {
		data_type v = p->element[p->front];
		p->front = (p->front + 1) % MAX;
		printf("已出队%d\n", v);
		p->count--;
		return v;
	}

}


void print_queue(queue_ptr p)
{
	if (is_empty(p))return;
	else {
		for (int i = p->front; i != p->rear; i = (i + 1) % MAX)
		{
			printf("%d\n", p->element[i]);
		}
	}
}
data_type get_front(queue_ptr p)
{
	printf("Front: %d\n", p->element[p->front]);
	return p->element[p->front];
}

main

#include"Lk.h"
int main() {
	//extern void queue_creat(queue_ptr p);
	//extern int is_empty(queue_ptr p);
	//extern int is_full(queue_ptr p);
	//extern data_type in_queue(queue_ptr p, data_type data);
	//extern data_type out_queue(queue_ptr p);
	//extern void print_queue(queue_ptr p);
	//extern data_type get_front(queue_ptr p);
	clock_t start = clock();
	queue_ptr s = (queue_ptr)malloc(sizeof(queue));
	queue_ini(s);
	for (int i = 0; i < 99; i++) {
		in_queue(s, i);
	}
	for (int j = 0; j < 50; j++)
	{
		out_queue(s);
	}
	get_front(s);

	clock_t end = clock();
	double time_taken = ((double)(end - start)) / CLOCKS_PER_SEC;
	printf("\n程序运行时间: %f 秒\n", time_taken);
	return 0;
}

标签:队列,type,queue,front,计数器,extern,数据结构,data,ptr
From: https://blog.csdn.net/2302_81152643/article/details/141124650

相关文章

  • 【Java数据结构】---泛型
    乐观学习,乐观生活,才能不断前进啊!!!我的主页:optimistic_chen我的专栏:c语言,Java欢迎大家访问~创作不易,大佬们点赞鼓励下吧~文章目录包装类装箱和拆箱泛型泛型语法擦除机制泛型的上届泛型方法静态泛型方法完结包装类在Java中,由于基本类型不是继承自Objec......
  • 队列mq 相关
    1.队列相关什么是消息队列消息队列是一种异步的通信方式,用于在分布式系统中管理消息传递。采用了生产者消费者模式,生产者将消息发送到队列,消费者负责从队列接收消息队列的好处使用队列的核心好处主要有3个,分别是解耦、异步和削峰2.rocket相关2.1rocketmq如何做......
  • LinkedList模拟栈数据结构的集合,并测试
    packagecom.shujia.day13;importjava.util.LinkedList;/*LinkedList请用LinkedList模拟栈数据结构的集合,并测试栈:先进后出题目的要求是:自己创建一个类,将LinkedList作为成员变量,将来创建自己的类对象,使用自己的方法,但是底层用的是LinkedList中的方法......
  • 【经验分享】数据结构——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散
    目录1.线性探测(LinearProbing)2.平方探测(QuadraticProbing)3.双散列探测(DoubleHashing)4.分离链接法(SeparateChaining)5.再散列(Rehashing)如何解答这些常见问题1.写出处理冲突的方法名称2.构造基于该处理冲突方法的哈希表3.求出该哈希表在等概率情况下查找成功......
  • 栈和队列part01
    今天学习了栈和队列的第一部分。基础知识用栈模拟队列(双栈)用队列模拟栈(一个队列,但是需要重复将队头元素写到队尾)栈的基本应用(括号匹配、删除重复项、逆波兰表达式)1.基础知识栈和队列是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是我们可以控......
  • 栈和队列part03
    今天学习了队列的常见题型:滑动窗口最大值,先进先出不难想到队列,最大值可以考虑优先队列,但是此题还是典型的单调队列(需要自己实现)前k个高频元素,维护最大值常用优先队列,注意选的最小堆7.239滑动窗口最大值(队列)题目:给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左......
  • C++提高编程—4、STL常用容器—list(链表)和queue(队列)
    7list容器 7.1基本概念 7.2 构造函数 7.3 赋值和交换 7.4 大小操作  使用10000来填充。7.5 插入与删除 7.6 数据存取 7.7 反转与排序  8set/multset容器 7.1基本概念7.2 构造和赋值7.3大小和交换7.4 插入与删除7.5 查......
  • 数据结构----二叉树
              小编会一直更新数据结构相关方面的知识,使用的语言是Java,但是其中的逻辑和思路并不影响,如果感兴趣可以关注合集。    希望大家看完之后可以自己去手敲实现一遍,同时在最后我也列出一些基本和经典的题目,可以尝试做一下。大家也可以自己去力扣或者......
  • 【数据结构】—— 内部排序算法详解
    1、前言2、常见排序算法3、排序算法实现3.1直接插入排序3.2希尔排序3.3选择排序3.4堆排序3.5冒泡排序3.6快速排序3.6.1单趟排序hoare法挖坑法双指针法3.6.2非递归实现3.6.3常见问题基准值的选取小区间优化3.7归并排序3.7.1递归实现3.7.2非递归实现3.8......
  • Python数据结构:列表详解(创建、访问、修改、列表方法)①
    @[toc]Python中的列表是一个非常强大的数据结构,它允许我们存储、访问和操作一系列的数据。列表可以包含任何类型的对象,包括数字、字符串、甚至其他列表。本文将详细介绍Python列表的创建、访问、修改以及列表方法,并附上一个综合的例子,全面展示列表在实际编程中的应用。一......