7.队列算法

算法:队列算法

队列是一种抽象的数据结构,有点类似于Stacks。与堆栈不同,队列的两端都是开放的。一端始终用于插入数据(入队),另一端用于删除数据(出队)。队列遵循先进先出方法,即首先访问先存储的数据项。

队列示例

一个真实的队列示例可以是单车道单向道路,车辆首先进入,首先退出。更多真实世界的例子可以看作是售票窗口和公共汽车站的队列。

队列表示

我们现在明白,在队列中,我们出于不同的原因访问两端。下面给出的下图试图将队列表示解释为数据结构

队列示例

与堆栈一样,也可以使用数组,链接列表,指针和结构来实现队列。为简单起见,我们将使用一维数组实现队列。

基本操作

队列操作可能涉及初始化或定义队列,利用它,然后从存储器中完全擦除它。在这里,我们将尝试理解与队列相关的基本操作

  • enqueue() - 将项添加(存储)到队列中。
  • dequeue() - 从队列中删除(访问)一个项目。

为了使上述队列操作有效,需要更多的功能。这些是 -

  • peek() - 获取队列前面的元素而不删除它。
  • isfull() - 检查队列是否已满。
  • isempty() - 检查队列是否为空。

在队列中,我们总是将 前端 指针指向的数据出列(或访问),并在队列中排队(或存储)数据时我们采用 指针的帮助。

让我们首先了解一下队列的支持功能

窥视()

此功能有助于查看队列 前面 的数据。peek()函数的算法如下

算法

begin procedure peek
   return queue[front]
end procedure

用C编程语言实现peek()函数

int peek() {
   return queue[front];
}

已满()

由于我们使用单维数组来实现队列,我们只需检查后指针是否达到MAXSIZE以确定队列已满。如果我们将队列保存在循环链表中,算法将有所不同。isfull()函数的算法

算法

begin procedure isfull

 if rear equals to MAXSIZE
    return true
 else
    return false
 endif

end procedure

在C编程语言中实现isfull()函数

bool isfull() {
 if(rear == MAXSIZE - 1)
    return true;
 else
    return false;
}

是空的()

isempty()函数的算法

算法

begin procedure isempty

 if front is less than MIN  OR front is greater than rear
    return true
 else
    return false
 endif

end procedure

如果 front 的值小于MIN或0,则表示队列尚未初始化,因此为空。

这是C编程代码

bool isempty() {
 if(front < 0 || front > rear)
    return true;
 else
    return false;
}

入队行动

队列维护两个数据指针, 前端后端 。因此,其操作比堆栈的操作相对难以实现。

应采取以下步骤将数据排入(插入)到队列中

  • 第1步 - 检查队列是否已满。
  • 步骤2 - 如果队列已满,则产生溢出错误并退出。
  • 步骤3 - 如果队列未满,则增加 指针以指向下一个空白区域。
  • 步骤4 - 将数据元素添加到后方指向的队列位置。
  • 第5步 - 返回成功。

插入操作

有时,我们还会检查队列是否已初始化,以处理任何无法预料的情况。

入队操作算法

procedure enqueue(data)      

   if queue is full
      return overflow
   endif

   rear ← rear + 1
   queue[rear] ← data
   return true

end procedure

在C编程语言中实现enqueue()

int enqueue(int data)      
 if(isfull())
    return 0;

 rear = rear + 1;
 queue[rear] = data;

 return 1;
end procedure

出列操作

从队列中访问数据是两个任务的过程 - 访问 前端 指向的数据并在访问后删除数据。采取以下步骤来执行 出列 操作

  • 第1步 - 检查队列是否为空。
  • 步骤2 - 如果队列为空,则产生下溢错误并退出。
  • 步骤3 - 如果队列不为空,请访问 前端 指向的数据。
  • 步骤4 - 增加 指针以指向下一个可用数据元素。
  • 第5步 - 返回成功。

删除操作

出列操作的算法

procedure dequeue

   if queue is empty
      return underflow
   end if

   data = queue[front]
   front ← front + 1
   return true

end procedure

在C编程语言中实现dequeue()

int dequeue() {
 if(isempty())
    return 0;

 int data = queue[front];
 front = front + 1;

 return data;
}

   front ← front + 1
   return true

end procedure

在C编程语言中实现dequeue()

int dequeue() {
 if(isempty())
    return 0;

 int data = queue[front];
 front = front + 1;

 return data;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
循环队列是一种特殊的队列,它可以在固定大小的数组上实现队列的所有操作。以下是循环队列算法: 1. 初始化循环队列: - 创建一个长度为 k 的数组,表示循环队列。 - 初始化队列头(front)和队列尾(rear)为 0。 2. 判断队列是否为空: - 如果 front == rear,则队列为空。 3. 判断队列是否已满: - 如果 (rear + 1) % k == front,则队列已满。 4. 入队操作: - 如果队列未满,则将元素插入到队列尾(rear)位置。 - 将 rear 后移一位:rear = (rear + 1) % k。 5. 出队操作: - 如果队列非空,则将队列头(front)位置的元素出队。 - 将 front 后移一位:front = (front + 1) % k。 6. 获取队列头元素: - 如果队列非空,则返回队列头(front)位置的元素。 7. 获取队列长度: - 队列长度为 (rear - front + k) % k。 以下是该算法的 Python 代码实现: ```python class CircularQueue: def __init__(self, k): self.queue = [0] * k self.k = k self.front = 0 self.rear = 0 def is_empty(self): return self.front == self.rear def is_full(self): return (self.rear + 1) % self.k == self.front def enqueue(self, value): if not self.is_full(): self.queue[self.rear] = value self.rear = (self.rear + 1) % self.k def dequeue(self): if not self.is_empty(): value = self.queue[self.front] self.front = (self.front + 1) % self.k return value def get_front(self): if not self.is_empty(): return self.queue[self.front] def get_length(self): return (self.rear - self.front + self.k) % self.k ``` 该算法的时间复杂度为 O(1)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

度假的小鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值