队列顺序存储(循环队列)

/*
 * 2015年4月17日 09:07:17
 * 目的:实现循环队列(顺序存储结构),本来我想要在实现循环队列之前
 * 先实现队列的顺序存储,但是这种算法有很大的缺点
 * 首先会造成假溢出现象
*/

/*
 * 解决队列的相关问题,就是怎么判断队列是否满了或者空了
 * 第一种方法:
 * 我们在队满和对空时都是real = front;这样就不够具体,容易出错
 * 所以我们采取牺牲一个存储单元,这样对空时,判断是:real == front
 * 队满的操作是:(real+1)%maxSize == front
 * 第二种方法:就是增加一个变量来表示队列中元素的个数,size
 * 这里我使用第一种方法。
*/

# include <stdio.h>
# define maxSize 50

struct sqQueue{
	int *data;
	int front; //对头指针
	int rear; //队尾指针
};

//初始化
void initQueue(sqQueue *queue)
{
	queue->data = new int[maxSize];
	queue->front = queue->rear = 0; //初始化队首和队尾指针
}

//判断队列是否为空
bool isEmpty(sqQueue *queue)
{
	if(queue->front == queue->rear)
		return true;
	else
		return false;
}

//判断队列是否满了
bool isFill(sqQueue *queue)
{
	if(queue->front == (queue->rear+1) % maxSize)
		return true;
	else
		return false;
}

//入队列
void enterQueue(sqQueue *queue,int value)
{
	if(isFill(queue))
	{
		printf("队列已经满了,无法再插入其他数!\n");
	}
	else
	{
		queue->data[queue->rear] = value; //给队尾指针赋值
		queue->rear = (queue->rear+1) % maxSize; //给队尾指针加1取模
	}
}

//出队列
void outofQueue(sqQueue *queue,int *value)
{
	if(isEmpty(queue))
	{
		printf("队列为空!,无法出队列.\n");
	}
	else
	{
		*value = queue->data[queue->front];
		queue->front = (queue->front+1) % maxSize;
	}
}

//输出队列
void printQueue(sqQueue *queue)
{
	if(isEmpty(queue))
		printf("队列为空!,无法出队列.\n");
	else
	{
		printf("队列的元素是:\n");
		if(queue->rear < queue->front)
		{
			for(int i = queue->front;i <maxSize;i++)
			{
				printf("%4d ",queue->data[i]);
				if((i+1) % 10 == 0)
					printf("\n");
			}

			for(int j = 0;j < queue->rear;j++)
			{
				printf("%4d ",queue->data[i]);
				if((i+1) % 10 == 0)
					printf("\n");
			}
		}
		else
		{
			for(int i = queue->front;i < queue->rear;i++)
			{
				printf("%4d ",queue->data[i]);
				if((i+1) % 10 == 0)
					printf("\n");
			}
			printf("\n");
		}
	}
}

int main()
{
	sqQueue queue;
	initQueue(&queue);
	for(int i = 1;i < 20;i++)
		enterQueue(&queue,i);
	printQueue(&queue);
	int value ;
	outofQueue(&queue,&value);
	printf("出队列的元素是:%d\n",value);
	printQueue(&queue);
	return 0;
}

时间: 2024-11-04 18:09:43

队列顺序存储(循环队列)的相关文章

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

c语言描述-链式队列与循环队列

我真的不喜欢写代码 队列的特点 先进先出,即只能从队尾插入元素,从队头删除元素 队列的链式存储结构 #include<stdio.h> #include <stdlib.h> #include<malloc.h> typedef struct QNode { int date; struct QNode *next; }QNode ,*QueuePtr; typedef struct { int size; //记录队列长度 QueuePtr front; //头指针

数据结构6_顺序队列(循环队列)

本文实现了顺序队列,与链队列不同的是,顺序队列需要考虑一个问题, 问题情况如下, 解决办法:循环队列,当rear到分配的数组空间末尾时,转到数组头 但是当q.rear==q.front时,又如何区分一种是空队列,一种是满队列的情况呢 这里有两种方案 本次代码实现了第一种方法,同时设置了一个技术变量length,稍加改动便可实现第二个方法 代码如下: #include<iostream>using namespace std;//该顺序队列为循环队列,解决队尾指针达到最大值,队列中有空闲单元,但

队列与循环队列

复习一下队列与循环队列的实现(C语言) 1.单链队列: 1 typedef struct QNode{ //若不写typedef,在C中每次定义QNode需要在前面加上struct,而C++不必 2 QElemType data; 3 struct QNode *next; 4 }QNode,*QueuePtr; 5 6 typedef struct{ //若不写结构体名,则需要加上typedef 7 QueuePtr front; 8 QueuePtr rear; 9 }LinkQueue;

二、数据结构之栈、队列、循环队列

二.数据结构之栈.队列.循环队列 顺序栈 Stack.h 结构类型,函数声明: #ifndef _STACK_H_ #define _STACK_H_ typedef int SElementType; ///顺序栈 #define STACK_INIT_SIZE 20 #define STACK_INCREMENT 10 typedef struct { SElementType * base; SElementType * top; int stackSize;///当前栈的大小 }SqSt

08 队列的顺序存储---循环队列

方法:用数组 + 头指针 + 尾指针 实现的,从尾部插入,从头部删除,先进先出的,FIFO. 循环队列中数据,比数组少1.

数据结构(C实现)------- 顺序队列(非循环队列)

和栈相反,队列是一种先进先出的的线性表.它只允许在表的一端进行插入,而在另一端删除元素.这和我们日常生活中的队列是一致的,最早进入队列的元素最早离开.在队列中,允许插入的一端叫做队尾,允许删除的一端则稀烂为队头. 顺序队列,即队列的顺序存储结构.由于队列的队头和队尾的位置均发生变化,因此在队列顺序存储结构中,除了用一组地址连续的存储单元依次存放从队头到队尾的元素之外,还需要附设两个指针front和rear指向队头和队尾元素. 为了操作方便,在此约定:在非空队列中,队头指针front始终指向队头元

数据结构_线性表_顺序队列_循环队列_链队列

个位看官,由于队列操作相对简单,我啥也不多说,直接上代码,欢迎验证!!! #pragma mark --abstract //队列(queue)是只允许在表的一端进行插入,在表的另一端进行删除的线性表,允许插入的一端称为队尾(rear) //允许删除的一端叫做队头(font),不含元素的队列称为空队列 //队列的特点是先进先出(FIFO线性表) #pragma mark --分类 //1.队列的顺序存储结构称为顺序队列(sequential queue),他是由存放队列的一维数组和分别指向队头和

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

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