Java 用链表实现栈和队列

  是一种基于后进先出(LIFO)策略的集合类型。当邮件在桌上放成一叠时,就能用栈来表示。新邮件会放在最上面,当你要看邮件时,会一封一封从上到下阅读。栈的顶部称为栈顶,所有操作都在栈顶完成。

  前面提到的新邮件,就是在栈顶入栈(push),阅读的时候从栈顶取出一封就是出栈(pop)。就像下面这个图一样,你不能从最下面直接拿一封信出来。

 1 package ABAB;
 2 
 3 /**
 4  * 链表实现栈
 5  * @param <Item>
 6  */
 7 public class Stack<Item> {
 8 
 9     private Node first;
10     private Integer N = 0;
11 
12     private class Node {
13         Item item;
14         Node next;
15 
16         public Node(Item i) {
17             this.item = i;
18             this.next = null;
19         }
20     }
21 
22     public boolean isEmpty() { return N == 0; }
23 
24     public int size() { return N; }
25 
26     /**
27      * 进栈
28      *
29      * @param i
30      */
31     public void push(Item i) {
32         Node node = new Node(i);
33         if (first == null) {
34             first = node;
35             N++;
36             return;
37         }
38         Node oldFirst = first;
39         first = node;
40         first.next = oldFirst;
41         N++;
42     }
43 
44     /**
45      * 获取栈顶元素
46      *
47      * @return
48      */
49     public Item peek() {
50         if (first == null)
51             return null;
52         return first.item;
53     }
54 
55     /**
56      * 出栈
57      *
58      * @return
59      */
60     public Item pop() {
61         if (isEmpty())
62             return null;
63         Item item = first.item;
64         first = first.next;
65         N--;
66         return item;
67     }
68 
69 }

 


队列

  队列是一种基于先进先出(FIFO)策略的集合类型。例如排队上车,先排队的人可以先上车。

  队列的链表实现中有两个指针,一个指向队头,一个指向队尾。当有新的元素进入时,新元素被放在队尾。当要出队时,从队头弹出元素,并且将队头后移。

 1 package ABAB;
 2 
 3 /**
 4  * 链表实现队列
 5  * @param <Item>
 6  */
 7 public class Queue<Item> {
 8 
 9     private Node first;
10     private Node last;
11     private int N = 0;
12     private class Node{
13         Item item;
14         Node next;
15         public Node(Item i){
16             this.item = i;
17             this.next = null;
18         }
19     }
20 
21     public boolean isEmpty(){return N == 0;};
22     public int size(){return N;}
23 
24     /**
25      * 入队
26      * @param item
27      */
28     public void enqueue(Item item){
29         Node node = new Node(item);
30         Node oldLast = last;
31         last = node;
32         if(isEmpty())
33             first = last;
34         else
35             oldLast.next = last;
36         N++;
37     }
38 
39     /**
40      * 出队
41      * @return
42      */
43     public Item dequeue(){
44         Item item;
45         if(isEmpty())
46             return null;
47         item = first.item;
48         first = first.next;
49         N--;
50         return item;
51     }
52 
53     /**
54      * 获取队首元素
55      * @return
56      */
57     public Item peek(){
58         if(isEmpty())
59             return null;
60         return first.item;
61     }
62 
63 }
posted @ 2020-01-02 09:58  ELAIRS  阅读(601)  评论(0编辑  收藏  举报