删除并插入循环队列

时间:2013-08-24 06:05:05

标签: java c++ algorithm data-structures queue

在大学里,教授要求我们设计一种算法来实现循环队列。我们必须为'remove()'和'insert()'函数编写算法。这是我经过几个小时思考后想出来的。

Declarations: q = circular queue structure that contains 3 elements 
                --> x[MAX] = array of MAX integers
                --> rear = logical pointer used for inserting elements at that particular index
                --> front = logical pointer used for deleting elements at that particular index
Predefined functions:
                --> incr (int y) : special function to set y to 0 once it contains MAX else do y++
                --> decr (int y) : special function to set y to MAX if it contains 0 else do y--

Preconditions : At the initial time of defining the structure set rear and front both at 0

Algorithm REMOVE(q): Returns an int
1.  set a <- q.x[q.front]
2.  incr (q.front) 
3.  if q.front >= q.rear 
    1.  decr (q.front)
    2.  print "Queue Empty"
    else
    1. return a

Algorithm INSERT(q,a) : Returns nothing
1.  incr (q.rear)
2.  if q.rear = q.front
    1.  decr (q.rear)
    2.  print "Queue Full"
    else
    1.  set q.x[q.rear] <- a

该算法使用'front'永远不会超过'后'的事实。因此,如果'front = rear'意味着队列为空,则增加'front'。如果'后=前'意味着队列已满,那么增加'后方'。

但是当我向教授展示时,他说这不是解决方案。

这个逻辑是不正确的?如果是这样,这个算法的缺陷是什么? 如果可能的话,请提出改进​​建议。

(PS:我没有用Google搜索解决方案的原因是因为我想自己实现这一点。)

1 个答案:

答案 0 :(得分:0)

如果队列初始化后的第一个操作是REMOVE请求,则

您的设置将失败。这样做的原因是您首先递增前索引,然后检查是否等于后索引以检测队列是空还是满。但是,在初始化之后,两个索引在队列为空时已经相等。