`
xglla_1129
  • 浏览: 10651 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

(转)循环队列的队空与队满的条件

阅读更多

 转
http://blog.csdn.net/kangquan2008/article/details/5719529

为了方便起见,约定:初始化建空队时,令
      front=rear=0,
  当队空时:front=rear
  当队满时:front=rear 亦成立
  因此只凭等式front=rear无法判断队空还是队满。  有两种方法处理上述问题:
    (1)另设一个标志位以区别队列是空还是满。
    (2)少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位置上”作为队列“满”状态的标志。即:
  队空时: front=rear
  队满时: (rear+1)%maxsize=front 

  front指向队首元素,rear指向队尾元素的下一个元素。 

 

/////////////////////////////////////////
// 
// author: kangquan2008@csdn
//
/////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define QUEUE_SIZE 10
#define EN_QUEUE 1
#define DE_QUEUE 2
#define EXIT     3

typedef int    Item;
typedef struct QUEUE{

	Item * item;
	int front;
	int tear;

}Queue;

int init_queue(Queue * queue)
{
	queue->item = malloc(QUEUE_SIZE * sizeof(Item));
	if(!queue->item)
	{
		printf("%s\n","Alloc failed,not memory enough");
		exit(EXIT_FAILURE);
	}

	queue->front = queue->tear = 0;

	return 1;
}

int en_queue(Queue * queue, Item item)
{
	if((queue->tear+1) % QUEUE_SIZE == queue->front)
	{
		printf("%s\n","The queue is full");
		return -1;
	}

	queue->item[queue->tear] = item;
	queue->tear = (queue->tear + 1) % QUEUE_SIZE;

	return 1;
}

int de_queue(Queue * queue, Item * item)
{
	if(queue->front == queue->tear)
	{
		printf("%s\n","The queue is empty");
		return -1;
	}

	(*item) = queue->item[queue->front];
	queue->front = (queue->front + 1) % QUEUE_SIZE;

	return 1;
}

int destroy_queue(Queue * queue)
{
	free(queue->item);
}

int main()
{
	Queue que;
	init_queue(&que);
	int elem;
	bool flag = true;
	while(flag)
	{
		int choice;
		printf("1 for en_queue,2 for de_queue,3 for exit\r\nplease input:");
		scanf("%d",&choice);

		switch((choice))
		{
			case EN_QUEUE:
				printf("input a num:");
				scanf("%d",&elem);
				en_queue(&que,elem);
				break;
			case DE_QUEUE:
				if(de_queue(&que,&elem) == 1)
					printf("front item is:%d\n",elem);
				break;
			case EXIT:
				flag = false;
				break;
			default:
				printf("error input\n");
				break;
		}
	}

	destroy_queue(&que);
	return 0;
}

 

 

  • 大小: 29.1 KB
  • 大小: 68.2 KB
分享到:
评论

相关推荐

    循环队列的总结

    循环队列的基本操作包括**入队(enqueue)**、**出队(dequeue)**、**判断队列是否为空(isEmpty)** 和 **判断队列是否已满(isFull)**。 - **入队**:将元素添加到队尾,更新队尾指针。 - **出队**:移除队头...

    循环队列的C++实现

    循环队列是一种线性数据结构,它在物理结构上实现了一个闭合的循环,因此队首和队尾可以在数组的任意位置。这种设计使得在队列满或空时,仍能有效地进行入队和出队操作,避免了普通队列在达到边界条件时的特殊处理。...

    数据结构作业之七循环队列

    循环队列是数据结构中的一种线性数据结构,它的特点是队尾指针可以在数组范围内的任何位置循环前进,从而避免了普通队列在队列满时需要重新申请空间的问题。循环队列的设计使得其在存储空间上的利用率较高,且在处理...

    多线程与循环队列

    循环队列,又称为环形队列,是一种特殊的队列数据结构,它的存储空间形成一个环形,首尾相接,使得队列的插入(出队)和删除(入队)操作更加高效。在循环队列中,当队列满时,下一个元素会覆盖掉第一个元素的位置,...

    循环队列c程序

    判断方法是看队尾指针是否与队头指针相邻或者相等(对于循环队列,满和空的状态是相同的,都需要特殊处理)。如果队列未满,将元素存入队尾位置,并将队尾指针向前移动一位。 4. **出队操作**(dequeue):当需要从...

    简单的C语言循环队列

    在循环队列中,判断队列满的条件不再是固定的最大元素个数,而是取决于队头和队尾指针的位置关系。 **2. 循环队列的实现原理** 循环队列通常使用数组作为底层数据存储结构。队头和队尾各有一个指针,分别表示当前...

    数据结构实验三(循环队列基本操作)题目和源程序

    1. **循环队列基本操作**:包括构造循环队列、清空队列、向队列插入新元素、返回队头元素以及删除队头元素等基本功能。 2. **约瑟夫环问题**:通过循环队列模拟约瑟夫环问题,实现并输出特定条件下的出列序列。 ###...

    数据结构之循环顺序队列

    在循环队列中,当rear赶上front时,表示队列已满;当front和rear相等时,队列为空。为了处理这种情况,循环队列通常会使用模运算,使得front和rear在数组范围内循环移动。 具体实现上,我们可以使用C++语言来编写...

    C#循环队列

    循环队列的基本思想是通过数组或链表模拟一个首尾相连的队列,当队列满时,不再从队尾插入元素,而是重新从队头开始,形成一种循环的效果。这使得循环队列避免了传统队列在达到容量限制时可能出现的问题,提高了效率...

    循环队列 C++不同策略模板实现

    为了实现循环,我们需要在进行进队和出队操作时处理边界条件,例如队头等于队尾时,并不意味着队列为空,而可能是满或者空,这取决于具体实现的策略。 5. **模板类的定义**:在C++中,定义一个循环队列的模板类可能...

    算法-理论基础- 队列- 循环队列(包含源程序).rar

    循环队列是传统线性队列的一种优化形式,通过巧妙地利用数组的循环特性,解决了线性队列在操作过程中可能出现的“满”和“空”状态判定复杂的问题。 循环队列的基本思想是将一个固定大小的数组视为一个环形结构,队...

    c语言 循环队列

    为了确保程序的正确性,还需要进行充分的测试,包括边界条件测试(如队列空和满的情况),以及各种组合的入队、出队和操作序列。这通常通过编写单元测试或者集成测试来完成。 循环队列在许多实际应用中都有重要作用...

    数组实现循环队列(有bug版)

    ### 数组实现循环队列(有bug版...本文档中的循环队列代码存在多处逻辑错误,主要集中在队列初始化、入队、出队以及队空判断等方面。针对这些问题,我们需要对相关逻辑进行修正和完善,以确保循环队列能够正确地工作。

    可以阻塞读的循环队列

    在“可以阻塞读的循环队列”中,我们主要关注的是如何在队列满时阻止读取操作,直到有新的元素入队,以及如何确保在多线程环境中的安全性。 首先,我们来理解循环队列的基本概念。它由一个固定大小的数组和两个指针...

    8584 循环队列的基本操作

    在循环队列中,入队时需要检查队列是否已满(即 `rear` 指针与 `front` 指针相等前一位)。如果队列未满,新元素将被添加到由 `rear` 指针指向的位置,然后更新 `rear` 指针至下一个位置(`rear = (rear + 1) % ...

    数据结构 循环队列c++源代码

    4. **队空条件**:队列为空的条件是队尾指针等于队头指针,即`rear == front`。 ### C++实现 #### 定义队列结构 ```cpp typedef struct { QElemType* base; int front; int rear; } SqQueue; ``` 这里定义了...

    队列初步介绍,包括循环队列以及迷宫问题等

    ### 队列基础知识与循环队列概念 队列是一种线性数据结构,遵循先进先出(FIFO)原则,即最先加入队列的元素将会最先被移除。队列通常用于多任务处理系统中,比如操作系统的进程调度、打印机队列管理、网络数据包...

    队列rear,number来判队满判队空

    - **队列为空的判断**:在循环队列中,当`rear`等于`front`时,有两种情况:一种是队列为空,另一种是队列为满。因此,仅凭`rear`和`front`无法准确判断队列是否为空。结合队列的长度`number`可以更准确地判断队列的...

    C语言实现队列源码,包含顺序队列,链式队列,循环队列,亲测可用

    循环队列的关键在于判断队列是否为空或已满的条件,这通常通过队头和队尾的差值模数组长度来实现。 这些源代码提供了实现队列功能的基本框架,包括初始化队列、入队、出队、查看队头元素、检查队列是否为空和已满等...

    可扩充循环队列

    传统的循环队列是利用数组实现的线性结构,具有首尾相连的特点,当队列满或空时,需要特殊处理,而可扩充循环队列则通过动态调整大小来避免这些问题。 在可扩充循环队列的设计中,通常会使用两个数组(或一个数组的...

Global site tag (gtag.js) - Google Analytics