【问题标题】:Remove and Insert in a circular queue在循环队列中删除和插入
【发布时间】:2013-08-27 06:05:34
【问题描述】:

在大学里,教授要求我们设计一种算法来实现循环队列。我们必须为“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

此算法使用“前”永远不会超过“后”这一事实。因此,如果“前=后”增加“前”意味着队列为空。如果 'rear = front' 表示队列已满,则增加 'rear'。

但是当我把这个给我的教授看时,他说这不是解决方案。

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

(PS:我没有在谷歌上搜索解决方案的原因是因为我想自己实现这个。)

【问题讨论】:

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


    【解决方案1】:

    如果您的队列初始化后的第一个操作是 REMOVE 请求,您的设置将失败。这样做的原因是您首先增加前面的索引,然后检查是否等于后面的索引来检测队列是空的还是满的。但是,在初始化后,两个索引已经相等,而队列为空。

    【讨论】:

    • 感谢您的及时回复。如果我在 REMOVE 算法的第 3 步中将条件更改为前 > = 后,它就会得到处理。非常感谢。
    • 您应该考虑在插入/删除操作中首先检查索引的相等性,以避免在队列为空/满时反转 incr/decr 调用
    • 当然这会使算法更高效。但我之所以这样写,是为了让我使用的逻辑更加不言自明。
    • 我觉得首先测试先决条件,然后执行任何相关操作显然更自然。我什至认为这是一种模式,并期望其他代码表现类似。当然,Ymmv 和恕我直言。
    • 当然。我尊重你的意见。在编写进一步的算法时会牢记这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多