编程新手求助:如何实现Queue的enqueue与dequeue方法
队列(Queue)实现入门指导
一、为什么knowsFirst要初始化为null?
队列刚创建的时候是空的,没有任何元素。knowsFirst的作用是指向队列里的第一个元素,既然空队列里啥都没有,那它自然要设成null——就像你刚买了个空盒子,盒子里没有东西,你没法指着任何一个物品一样。
二、先改代码里的小错误
注意:你的代码里有个常见的新手错误——把判断相等的==写成了赋值的=,比如if (knowsFirst = null),这会把knowsFirst直接设成null,而不是判断它是不是null,所有这种地方都要改成==。
三、实现enqueue(入队)方法
入队是把新元素加到队列的末尾,遵循「先进先出」的规则。我们分两部分实现:
1. Queue类的enqueue方法
public void enqueue(Object pObject) { // 先创建一个新的队列元素 QueueElement newElement = new QueueElement(pObject); if (knowsFirst == null) { // 情况1:队列是空的,新元素就是第一个元素 knowsFirst = newElement; } else { // 情况2:队列已有元素,找到最后一个元素,把新元素接在它后面 QueueElement current = knowsFirst; // 一直找,直到某个元素的follower是null(说明它是最后一个) while (current.getFollower() != null) { current = current.getFollower(); } // 让最后一个元素的follower指向新元素 current.enqueue(pObject); } }
2. QueueElement类的enqueue方法
这个方法的作用是给当前元素添加后续元素,也就是把新元素接在自己后面:
public void enqueue(Object pObject) { if (knowsFollower == null) { // 当前元素是最后一个,直接把新元素设为自己的follower knowsFollower = new QueueElement(pObject); } else { // 当前元素不是最后一个,把任务交给自己的follower继续找末尾 knowsFollower.enqueue(pObject); } }
简单说:如果自己后面没元素,就把新元素接在自己后面;如果有,就让后面的元素去处理,一直传到最后一个元素那里。
四、实现dequeue(出队)方法
出队是把队列的第一个元素移除,遵循「先进先出」规则:
public void dequeue() { if (knowsFirst != null) { // 把第一个元素换成它的下一个元素,原来的第一个元素会被自动回收 knowsFirst = knowsFirst.getFollower(); } // 如果队列本来就是空的,啥都不用做 }
举个例子:队列里是元素A→B→C,knowsFirst指向A。出队后,knowsFirst改成指向B,A就被移出队列了。
内容的提问来源于stack exchange,提问作者dokka2ns2
相关产品推荐
相关产品推荐

