Java的栈与队列(LinkedList实现)

Java的栈与队列(LinkedList实现)

队列:

LinkedList<E> queue = new LinkedList<>();    
offer(e):     加入到队尾                  addLast(e)/offerLast(e)    
poll():       从队首取出并删除             poll()/removeFirst()    
peek():       从队首取出不删除             getFirst()/peek()

栈:

LinkedList<E> stack = new LinkedList<>();    
push(e):      压栈                  	 addFirst(e)/offerFirst()  
pop():        弹栈                       pop()/removeFirst()    
peek():       取出栈顶元素,不删除        getFirst()/peek()

栈和队列都是用LinkedList实现的,并且peek()方法名相同,但是对于栈来说peek()获取的是栈顶元素,对于队列来说peek()获取的是队首元素,那么
栈的peek()和队列的peek()会不会弄混呢??
例如:栈{1,2},队列{3,4}

LinkedList<Integer> linkedList = new LinkedList<>();            
linkedList.push(1);            
linkedList.push(2);            
linkedList.offer(3);            
linkedList.offer(4);            
System.out.println(linkedList.peek());     //查看栈顶元素:2            
System.out.println(linkedList.pop());        //弹栈:2            
System.out.println(linkedList.peek());     //查看栈顶元素:1            
System.out.println(linkedList.pop());        //弹栈:1            
System.out.println(linkedList.peek());     //查看队首元素:3            
System.out.println(linkedList.poll());       //出队:3            
System.out.println(linkedList.peek());     //查看队首元素:4            
System.out.println(linkedList.poll());       //出队:4

查看源码分析原因:
第一个push:底层调用 addFirst(e),新建一个节点插入到链表头,此时 dummy -> 1
第二个push:底层调用 addFirst(e),新建一个节点插入到链表头,此时 dummy -> 2 -> 1
Java的栈与队列(LinkedList实现)_第1张图片

第一个offer:底层调用 add(e), 新建一个节点插入到链表尾,此时 dummy -> 2 -> 1 -> 3
第二个offer:底层调用 add(e), 新建一个节点插入到链表尾,此时 dummy -> 2 -> 1 -> 3 -> 4
Java的栈与队列(LinkedList实现)_第2张图片

peek() 操作第一个节点,返回链表的第一个节点值
Java的栈与队列(LinkedList实现)_第3张图片

pop()底层调用removeFirst(),poll()操作第一个节点,都会返回并删除链表的第一个节点,所以输出结果是 2,1,3,4
Java的栈与队列(LinkedList实现)_第4张图片
Java的栈与队列(LinkedList实现)_第5张图片

总结:
因为栈和队列底层都是LinkedList,是一个双向链表,两者输入和输出的唯一区别就在于:压栈会将节点加入到链表头,入队会将节点添加到链表尾,出栈和出队时都是将链表头返回并删除,所以栈和队列的输入和输出逻辑不会弄混!

你可能感兴趣的:(笔记,java)