java - 在循环队列中删除和插入

标签 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 = rear”意味着队列为空,则增加“front”。如果“rear = front”意味着队列已满,则增加“rear”。

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

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

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

最佳答案

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

关于java - 在循环队列中删除和插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18415515/

相关文章:

java - 返回具有最低双字段的对象

java - 在类中使用静态代码加载属性文件

c++ - 使用 CTime & asctime 将时间分配给字符串或 vector 字符串

c++ - 在现代 C++ 中优雅地定义多维数组

algorithm - 修改福特富尔克森算法的bfs,寻找增广路径

java - 从麦克风 Java 检测频率

c++ - 为什么在大括号初始化成员变量后还需要另一组大括号?

c++ - 使用C++在LeetCode中的Pow(x,n)。地址 sanitizer 33

java - 我使用 union-find 数据结构实现 Kruskal 算法有什么问题。

Java:如何删除 JPanel 屏幕