队列2:通过链表和集合实现队列
Posted 纵横千里,捭阖四方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列2:通过链表和集合实现队列相关的知识,希望对你有一定的参考价值。
数组实现队列问题还比较多,判断重点等还比较绕,使用链表则容易很多,另外我们还可以基于jdk提供的集合类来辅助我们实现一个队列。我们首先使用链表看一下。
1.基于链表实现队列
public class LinkQueue {
private Node front;
private Node rear;
private int size;
public LinkQueue() {
this.front = new Node();
this.rear = new Node();
}
/**
* 入队
* @param value
*/
public void in(Object value)throws Exception{
Node newNode = new Node(value);
Node temp = front;
while (temp.next != null){
temp = temp.next;
}
temp.next = newNode;
rear = newNode;
size ++;
}
/**
* 出队
* @throws Exception
*/
public Object out()throws Exception{
if(front.next == null){
throw new Exception("队列为空异常");
}
Node firstNode = front.next;
front.next = firstNode.next;
size--;
return firstNode.data;
}
/**
* 遍历队列
*/
public void traverse(){
Node temp = front.next;
while ( temp != null){
System.out.println(""+temp.data);
temp = temp.next;
}
}
}
2.基于jdk的集合类实现队列
其实jdk中本身已经提供了队列Queue,不过呢,我们基于ArrayList来自己实现一个:
import java.util.*;
/**
* 使用集合实现队列功能,使用int数组保存数据特点:先进先出,后进后出
*/
public class QueueTest2 {
public static void main(String[] args){
//测试队列
System.out.println("测试队列:");
Queue queue = new Queue();
queue.in(1);
queue.in(2);
queue.in(3);
System.out.println(queue.out());
System.out.println(queue.out());
queue.in(4);
System.out.println(queue.out());
System.out.println(queue.out());
queue.in(5);
System.out.println(queue.out());
}
}
//使用集合定义一个队列
class Queue {
List<Integer> list = new ArrayList<Integer>();
int index = 0; //下标
//入队
public void in(int n){
list.add(n);
index++;
}
//出队
public int out(){
if(!list.isEmpty()){
index--;
return list.remove(0);
}
return -1;
}
}
这个题目如果自己做,还是挺复杂的,如果要考察重点应是设计能力,我们就可以使用jdk提供的ArrayList或者LinkedList来漂亮的解决我们的问题,例如下面这个:
3.LeetCode1670:设计一个前中后队列
请你设计一个队列,支持在前,中,后三个位置的 push 和 pop 操作。
请你完成 FrontMiddleBack 类:
-
FrontMiddleBack() 初始化队列。
-
void pushFront(int val) 将 val 添加到队列的 最前面 。
-
void pushMiddle(int val) 将 val 添加到队列的 正中间 。
-
void pushBack(int val) 将 val 添加到队里的 最后面 。
-
int popFront() 将 最前面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。
-
int popMiddle() 将 正中间 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。
-
int popBack() 将 最后面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。
请注意当有 两个 中间位置的时候,选择靠前面的位置进行操作。比方说:
-
将 6 添加到 [1, 2, 3, 4, 5] 的中间位置,结果数组为 [1, 2, 6, 3, 4, 5] 。
-
从 [1, 2, 3, 4, 5, 6] 的中间位置弹出元素,返回 3 ,数组变为 [1, 2, 4, 5, 6] 。
如果使用linkedList,题目将非常简单:
class FrontMiddleBackQueue {
LinkedList<Integer> linkedList=new LinkedList<>();
int sum=0;
public FrontMiddleBackQueue() {
}
public void pushFront(int val) {
linkedList.addFirst(val);
sum++;
}
public void pushMiddle(int val) {
int mid=sum/2;
linkedList.add(mid,val);
sum++;
}
public void pushBack(int val) {
linkedList.addLast(val);
sum++;
}
public int popFront() {
if(linkedList.size()==0){
return -1;
}
int z=linkedList.getFirst();
linkedList.removeFirst();
sum--;
return z;
}
public int popMiddle() {
if(linkedList.size()==0){
return -1;
}
int mid = sum/2;
int z;
if(sum%2==0){
z=linkedList.get(mid-1);
}else{
z=linkedList.get(mid);
}
linkedList.remove(linkedList.indexOf(z));
sum--;
return z;
}
public int popBack() {
if(linkedList.size()==0){
return -1;
}
int z=linkedList.getLast();
linkedList.removeLast();
sum--;
return z;
}
}
以上是关于队列2:通过链表和集合实现队列的主要内容,如果未能解决你的问题,请参考以下文章
4-3《Java中所有集合》——链表和二叉树CollectionListSetMapIterator迭代器集合在JDK9中的新特性