📜  数据结构和算法-队列

📅  最后修改于: 2021-01-11 06:45:15             🧑  作者: Mango


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

队列示例

队列的真实示例可以是单车道单向道路,车辆首先进入,然后首先离开。在售票窗口和公交车站的队列中,可以看到更多实际示例。

队列表示

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

队列示例

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

基本操作

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

  • 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

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

int enqueue(int data)      
   if(isfull())
      return 0;
   
   rear = rear + 1;
   queue[rear] = data;
   
   return 1;
end procedure

出队操作

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

  • 步骤1-检查队列是否为空。

  • 步骤2-如果队列为空,则产生下溢错误并退出。

  • 步骤3-如果队列不为空,请访问front指向的数据。

  • 步骤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;
}

有关使用C编程语言的完整Queue程序,请单击此处