静态数组实现循环队列 c语言

#include<stdio.h>
#include<malloc.h>
#define Data_Type int
#define Queue_Len 5
//判断队满有两种方式,一种是加以个标记,比如说size。
//另一种是浪费一块空间,当占到N-1时,就算满。
typedef struct Queue{
	Data_Type data[Queue_Len];
	int front;//队头元素的前一个元素
	int rear;// 队尾元素
	//int size; 记录队列的大小
}QUEUE,* QQUEUE;

void create(QQUEUE);
bool isFull(QQUEUE);
bool isEmpty(QQUEUE);
bool add(QQUEUE,Data_Type);
Data_Type out(QQUEUE);
void traverse(QQUEUE);

int main(void){
	QUEUE queue ;
	create(&queue);
	add(&queue,1);
	add(&queue,2);
	add(&queue,3);
	add(&queue,4);
	out(&queue);
	add(&queue,5);
	out(&queue);
	add(&queue,6);
	out(&queue);
	add(&queue,7);
	traverse(&queue);

}

bool isFull(QQUEUE qQuere){
	if((qQuere->rear+1)%Queue_Len==qQuere->front){
		return true;
	} else{
		return false;
	}
}

bool isEmpty(QQUEUE qQueue){
	if(qQueue->front==qQueue->rear){
		return true;
	}else{
		return false;
	}
}

void create(QQUEUE qQueue){
	qQueue->front=qQueue->rear=0;
	return;
}

void traverse(QQUEUE qQueue){
	int i=qQueue->front;
	while(i!=qQueue->rear){
		//这里比较绕,为什么输出时要取余?
		//首先front表示的是队首元素的前一个元素,肯定是不能输出的。
		// 如果给他+1,则可以正常输出队首。
		//但队尾会出问题,如果下标是队尾下标,+1则会超出数组长度
		//所以再取余, 则输出正常
		printf("%d\n",qQueue->data[(i+1)%Queue_Len]);
		i++;
		i=i%Queue_Len;	

		//换一种好理解的
		//先找到下一个合法元素,找到再输出
		//所以直接输出i 就可以了,因为i已经是要找的下一个元素。

		//i++;
		//i=i%Queue_Len;
		//printf("%d\n",qQueue->data[i]);
	}
}

bool add(QQUEUE qQueue,Data_Type val){
	if(isFull(qQueue)){
		return false;
	}else{
		qQueue->rear = (qQueue->rear+1)%Queue_Len;
		qQueue->data[qQueue->rear]=val;
		return true;
	}
}
Data_Type out(QQUEUE qQueue){
	if(isEmpty(qQueue)){
		exit(-1);
	}else{

		Data_Type val = qQueue->data[qQueue->front+1];
		qQueue->front = (qQueue->front+1)%Queue_Len;
		return val;
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 08:24:07

静态数组实现循环队列 c语言的相关文章

C语言实现使用动态数组实现循环队列

我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作.由于数组的大小已经被指定,无法动态的扩展.所以在这篇博客中,我换成动态数组来实现.动态数组可以不断开辟内存空间,只是会在数组的初始化时有所不同,其他对数组的操作都是一样的.代码上传至 https://github.com/chenyufeng1991/Queue_DynamicArray . (1)声明变量 static int *queue;//声明数组 static int maxSize;//数组大

数据结构之循环队列c语言实现

    队列是一种先入先出的结构,数据从队列头出,队尾进.在linux内核中进程调度,打印缓冲区都有用到队列.     队列有多种实现方式,可以用链表,也可以用数组.这里用数组来实现一个简单的循环队列.首先创建一个大小为8的队列如下,队列头尾指针指向同一块内存,          当从队列尾部插入一个数据后变成下面的情形,为了便于处理,这里始终会浪费一个空间 继续插入数据,直到出现以下情形,表示队列满了, 接下来看一下出队的情形,从队列头出队3个元素, 再添加三个元素后队列又变成满的了, 在上面

Java用数组实现循环队列

复习了下数据结构,用Java的数组实现一下循环队列. 队列的类 1 //循环队列 2 class CirQueue{ 3 private int QueueSize; 4 private int front; 5 private int rear; 6 private int[] queueList ; 7 8 public CirQueue(int QueueSize){ 9 this.QueueSize = QueueSize; 10 queueList = new int[QueueSiz

Java数组实现循环队列的两种方法

用java实现循环队列的方法: 1.增加一个属性size用来记录目前的元素个数.目的是当head=rear的时候,通过size=0还是size=数组长度,来区分队列为空,或者队列已满. 2.数组中只存储数组大小-1个元素,保证rear转一圈之后不会和head相等,也就是队列满的时候,rear+1=head,中间刚好空一个元素:当rear=head的时候,一定是队列空了. import java.io.*; public class QueueArray { Object[] a; //对象数组,

47 _ 循环队列程序演示.swf

通过上面的分析我们已经对循环队列很了解了,现在我们来学习下循环队列的实现形式 1.代码使用数组现实循环队列 #include<stdio.h> #include<malloc.h> #include <stdio.h> #include <stdlib.h> typedef struct Queue{ int * data;//存储的数据,指向一个数组 int font ;//队列数据删除 int rear;//队列数据的添加 }QUEUE ,*PQUEUE

教你如何使用Java手写一个基于数组实现的队列

一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作.队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加. 在Java中队列又可以分为两个大类,一种是阻塞队列和非阻塞队列. 1.没有实现阻塞接口: 1)实现java.util.Queue的LinkList, 2)实现java.util.Abstra

数据结构学习(循环队列)

1. 尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定 2. 这个在做判断队列满的时候需要注意 (rear + 1) % maxSize == front [满] rear == front [空] package cn.imut; //循环队列 import java.util.Scanner; public class CircleArrayQueueDemo { public static void main(String[] args) { System.out.prin

数据结构基础(5)--队列和循环队列详解--静态方式

队列的具体应用: 所有和事件有关的操作都有队列的影子. (例如操作系统认为先进来的先处理) 定义: 一种可是实现"先进先出"的存储结构 分类: 链式队列:用链表实现 静态队列:用数组实现 静态队列通常都必须是循环队列,为了减少 内存浪费. 循环队列 : 1.静态队列为什么必须是循环队列 如果用传统意义的数组实现队列,无论入队还是出队,rear和front指针只能+不能-: 比 F元素下标小的的数组元素下标就浪费了. 循环队列怎么用呢? 当出现这种情况时,如果仍然需要插入元素,那么f指向

顺序循环队列的c语言实现

1. 循环队列的顺序存储结构 typedef struct { QElemType data[MAXSIZE]; int front; /* 头指针 */ int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */ }SqQueue; 2. 初始化一个空队列Q Status InitQueue(SqQueue *Q) { Q->front=0; Q->rear=0; return OK; } 3.将Q清为空队列 Status ClearQueue(SqQueue *Q) {