Java的栈与队列(linkedList实现)
队列:
linkedListqueue = new linkedList<>(); offer(e): 加入到队尾 addLast(e)/offerLast(e) poll(): 从队首取出并删除 poll()/removeFirst() peek(): 从队首取出不删除 getFirst()/peek()
栈:
linkedListstack = new linkedList<>(); push(e): 压栈 addFirst(e)/offerFirst() pop(): 弹栈 pop()/removeFirst() peek(): 取出栈顶元素,不删除 getFirst()/peek()
栈和队列都是用linkedList实现的,并且peek()方法名相同,但是对于栈来说peek()获取的是栈顶元素,对于队列来说peek()获取的是队首元素,那么
栈的peek()和队列的peek()会不会弄混呢??
例如:栈{1,2},队列{3,4}
linkedListlinkedList = 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
第一个offer:底层调用 add(e), 新建一个节点插入到链表尾,此时 dummy -> 2 -> 1 -> 3
第二个offer:底层调用 add(e), 新建一个节点插入到链表尾,此时 dummy -> 2 -> 1 -> 3 -> 4
peek() 操作第一个节点,返回链表的第一个节点值
pop()底层调用removeFirst(),poll()操作第一个节点,都会返回并删除链表的第一个节点,所以输出结果是 2,1,3,4
总结:
因为栈和队列底层都是linkedList,是一个双向链表,两者输入和输出的唯一区别就在于:压栈会将节点加入到链表头,入队会将节点添加到链表尾,出栈和出队时都是将链表头返回并删除,所以栈和队列的输入和输出逻辑不会弄混!



