package com.queueapi;
/**
* Created by Dhaval on 6/15/2016.
*/
public class DynamicArrayQueue {
private String[] s;
private int head = -1;
private int tail = -1;
public DynamicArrayQueue() {
}
public boolean isEmpty() {
return head == -1 || head > tail || s.length == 0;
}
public void enqueue(String item) {
if (isEmpty()) {
head = 0;
tail = 0;
s = new String[1];
}
if (tail - head == s.length) {
resize(s.length * 2);
}
s[tail++] = item;
}
public String dequeue() throws QueueUnderFlowException {
if (isEmpty()) {
throw new QueueUnderFlowException();
}
String item = s[head++];
if (tail - head == s.length / 4) {
resize(s.length / 2);
}
return item;
}
public void resize(int capacity) {
String[] copy = new String[capacity];
for (int i = head; i < tail; i++) {
copy[i - head] = s[i];
}
s = copy;
tail = tail - head;
head = 0;
}
}
我正在尝试使用支持三种基本功能的数组来实现动态可调整大小的队列:
isEmpty()
Enqueue()
Dequeue()
约束是队列应该总是在25-100%之内填充,因此当队列已满时我调整数组的大小以使其大小加倍,如果队列中的元素数量相等,则将大小减小到大小/ 2大小/ 4。
此队列与测试人员一起使用,该测试人员将输入视为: 1 - 2 - 3 - 何时&#34; - &#34;发生dequue()操作或者enqueue()。
代码在1 2 3 - - - - 输入失败。请告诉我一些关于我出错的地方。
Tester Client
package com.queueapi;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class QueueTester {
public static void main(String[] args) throws QueueUnderFlowException {
DynamicArrayQueue queue = new DynamicArrayQueue();
while(!StdIn.isEmpty()){
String s = StdIn.readString();
if(s.equals("-")){
StdOut.print(queue.dequeue());
}
else{
queue.enqueue(s);
}
}
}
}
答案 0 :(得分:0)
在您的问题案例中,成员值为:
head tail s
-1 -1 []
Enque "1"
0 1 ["1"]
Enque "2"
0 2 ["1" "2"]
Enque "3"
0 3 ["1", "2", "3", null]
Deque -> "1"
1 3 ["1", "2", "3", null]
Deque -> "1"
0 1 ["3", null]
Deque -> "1"
0 0 [null]
Deque -> null
从此变得非常清楚。你没有提出一个&#34; Underflow&#34;这是因为:
队列中的项目数为tail - head
,为零。但你不能检查;相反,你检查head > tail
,只有当队列中的项目数为负时才会失败。
您可以通过测试head >= tail
来解决此问题。