转
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)**。 - **入队**:将元素添加到队尾,更新队尾指针。 - **出队**:移除队头...
循环队列是一种线性数据结构,它在物理结构上实现了一个闭合的循环,因此队首和队尾可以在数组的任意位置。这种设计使得在队列满或空时,仍能有效地进行入队和出队操作,避免了普通队列在达到边界条件时的特殊处理。...
循环队列是数据结构中的一种线性数据结构,它的特点是队尾指针可以在数组范围内的任何位置循环前进,从而避免了普通队列在队列满时需要重新申请空间的问题。循环队列的设计使得其在存储空间上的利用率较高,且在处理...
循环队列,又称为环形队列,是一种特殊的队列数据结构,它的存储空间形成一个环形,首尾相接,使得队列的插入(出队)和删除(入队)操作更加高效。在循环队列中,当队列满时,下一个元素会覆盖掉第一个元素的位置,...
判断方法是看队尾指针是否与队头指针相邻或者相等(对于循环队列,满和空的状态是相同的,都需要特殊处理)。如果队列未满,将元素存入队尾位置,并将队尾指针向前移动一位。 4. **出队操作**(dequeue):当需要从...
在循环队列中,判断队列满的条件不再是固定的最大元素个数,而是取决于队头和队尾指针的位置关系。 **2. 循环队列的实现原理** 循环队列通常使用数组作为底层数据存储结构。队头和队尾各有一个指针,分别表示当前...
1. **循环队列基本操作**:包括构造循环队列、清空队列、向队列插入新元素、返回队头元素以及删除队头元素等基本功能。 2. **约瑟夫环问题**:通过循环队列模拟约瑟夫环问题,实现并输出特定条件下的出列序列。 ###...
在循环队列中,当rear赶上front时,表示队列已满;当front和rear相等时,队列为空。为了处理这种情况,循环队列通常会使用模运算,使得front和rear在数组范围内循环移动。 具体实现上,我们可以使用C++语言来编写...
循环队列的基本思想是通过数组或链表模拟一个首尾相连的队列,当队列满时,不再从队尾插入元素,而是重新从队头开始,形成一种循环的效果。这使得循环队列避免了传统队列在达到容量限制时可能出现的问题,提高了效率...
为了实现循环,我们需要在进行进队和出队操作时处理边界条件,例如队头等于队尾时,并不意味着队列为空,而可能是满或者空,这取决于具体实现的策略。 5. **模板类的定义**:在C++中,定义一个循环队列的模板类可能...
循环队列是传统线性队列的一种优化形式,通过巧妙地利用数组的循环特性,解决了线性队列在操作过程中可能出现的“满”和“空”状态判定复杂的问题。 循环队列的基本思想是将一个固定大小的数组视为一个环形结构,队...
为了确保程序的正确性,还需要进行充分的测试,包括边界条件测试(如队列空和满的情况),以及各种组合的入队、出队和操作序列。这通常通过编写单元测试或者集成测试来完成。 循环队列在许多实际应用中都有重要作用...
### 数组实现循环队列(有bug版...本文档中的循环队列代码存在多处逻辑错误,主要集中在队列初始化、入队、出队以及队空判断等方面。针对这些问题,我们需要对相关逻辑进行修正和完善,以确保循环队列能够正确地工作。
在“可以阻塞读的循环队列”中,我们主要关注的是如何在队列满时阻止读取操作,直到有新的元素入队,以及如何确保在多线程环境中的安全性。 首先,我们来理解循环队列的基本概念。它由一个固定大小的数组和两个指针...
在循环队列中,入队时需要检查队列是否已满(即 `rear` 指针与 `front` 指针相等前一位)。如果队列未满,新元素将被添加到由 `rear` 指针指向的位置,然后更新 `rear` 指针至下一个位置(`rear = (rear + 1) % ...
4. **队空条件**:队列为空的条件是队尾指针等于队头指针,即`rear == front`。 ### C++实现 #### 定义队列结构 ```cpp typedef struct { QElemType* base; int front; int rear; } SqQueue; ``` 这里定义了...
### 队列基础知识与循环队列概念 队列是一种线性数据结构,遵循先进先出(FIFO)原则,即最先加入队列的元素将会最先被移除。队列通常用于多任务处理系统中,比如操作系统的进程调度、打印机队列管理、网络数据包...
- **队列为空的判断**:在循环队列中,当`rear`等于`front`时,有两种情况:一种是队列为空,另一种是队列为满。因此,仅凭`rear`和`front`无法准确判断队列是否为空。结合队列的长度`number`可以更准确地判断队列的...
循环队列的关键在于判断队列是否为空或已满的条件,这通常通过队头和队尾的差值模数组长度来实现。 这些源代码提供了实现队列功能的基本框架,包括初始化队列、入队、出队、查看队头元素、检查队列是否为空和已满等...
传统的循环队列是利用数组实现的线性结构,具有首尾相连的特点,当队列满或空时,需要特殊处理,而可扩充循环队列则通过动态调整大小来避免这些问题。 在可扩充循环队列的设计中,通常会使用两个数组(或一个数组的...