队列

队列是一个抽象的数据结构,与堆栈有些相似。较对比于栈,队列打开两端。 一端总是用来插入数据(排队),另一个是用来删除数据(离队)。 队列使用先入先出的方法,即,第一存储的数据项先被访问。如下:

队列

队列中的一个真实的例子可以是单向的车道单行道,其中车辆第一进入,第一离开。更多真实世界的例子可以看出,队列在售票窗口和巴士站。

队列表示

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

Queue Example

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

基本操作

队列操作可能涉及到初始化或定义队列,利用它完成从内存中清除它。在这里,我们将试着去了解使用队列相关的基本操作 -

  • enqueue() − 添加(存储)项目到队列中。

  • dequeue() − 从队列中删除(访问)项目。

很少有更多的功能需要在上述队列提高操作效率。它们有 -

  • peek() − 获得在队列前面的元素而不移除它。

  • isfull() − 检查队列是否已满。

  • isempty() − 检查队列是否为空。

在队列中,我们总是出队(或访问)数据,通过前面的指针,查询(或存储)我们把后面的指针的帮助下将队列中的数据指出。

让我们先来了解一个队列的辅助功能 −

peek()

像栈,此功能可以看到在队列的前部的数据。peek() 函数算法如下 −

begin procedure peek

   return queue[front]
   
end procedure

在C语言中 peek()函数的实现-

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

isfull()

由于我们使用一维数组实现的队列,我们只是检查后指针要达到最大范围(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()

isEmpty()函数算法 -

begin procedure isempty

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

如果前面的值小于 MIN 或 0,它告诉队列尚未初始化,因此空。

下面是C语言编程代码 -

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

入队操作

由于队列维护两个数据指针,前部和后部,其操作比堆栈相对较难实现。

应采取以下步骤来将数据排入队列(插入)到一个队列 -

  • Step 1 − 检查队列是否已满

  • Step 2 − 如果队列已满,产生溢出错误,然后退出

  • Step 3 − 如果队列未满,增加尾部指针指向下一个空的空间

  • Step 4 − 添加数据元素到队列位置,其中后方(rear)指向

  • Step 5 − 返回成功

Insert Operation

有时,我们还要检查,如果队列被初始化或不处理任何意外情况。

排入队列的操作算法

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

解列操作

从队列中访问数据是两个任务的过程 − 访问前在这里指的是所指向的数据,以及访问后删除数据。将采取以下步骤来执行解列操作 -

  • Step 1 − 检查队列是否为空

  • Step 2 − 如果队列为空,产生溢错误,然后退出

  • Step 3 − 如果队列不为空,访问数据,并向前指向

  • Step 3 − 增量前指针指向下一个可用的数据元素

  • Step 5 − 返回成功

Remove Operation

算法解列操作 -

procedure dequeue
   if queue is empty
      return underflow
   end if

   data = queue[front]
   front ← front - 1
   
   return true
end procedure

出队列 dequeue() 的C语言实现:

int dequeue() {

   if(isempty())
      return 0;

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

   return data;
}

对于C编程语言的完整队列程序,请点击这里


上一篇: 表达式分析 下一篇: 队列实例代码(C语言)