使用链表实现栈

使用链表实现栈


1 public interface Stack<E> {
2 
3     int getSize();
4     boolean isEmpty();
5     void push(E e);
6     E pop();
7     E peek();
8 }
 1 public class LinkedListStack<E> implements Stack<E> {
 2 
 3     private LinkedList<E> list;
 4 
 5     public LinkedListStack(){
 6         list = new LinkedList<>();
 7     }
 8 
 9     @Override
10     public int getSize(){
11         return list.getSize();
12     }
13 
14     @Override
15     public boolean isEmpty(){
16         return list.isEmpty();
17     }
18 
19     @Override
20     public void push(E e){
21         list.addFirst(e);
22     }
23 
24     @Override
25     public E pop(){
26         return list.removeFirst();
27     }
28 
29     @Override
30     public E peek(){
31         return list.getFirst();
32     }
33 
34     @Override
35     public String toString(){
36         StringBuilder res = new StringBuilder();
37         res.append("Stack: top ");
38         res.append(list);
39         return res.toString();
40     }
41 
42     public static void main(String[] args) {
43 
44         LinkedListStack<Integer> stack = new LinkedListStack<>();
45 
46         for(int i = 0 ; i < 5 ; i ++){
47             stack.push(i);
48             System.out.println(stack);
49         }
50 
51         stack.pop();
52         System.out.println(stack);
53     }
54 }
  1 public class LinkedList<E> {
  2 
  3     private class Node{
  4         public E e;
  5         public Node next;
  6 
  7         public Node(E e, Node next){
  8             this.e = e;
  9             this.next = next;
 10         }
 11 
 12         public Node(E e){
 13             this(e, null);
 14         }
 15 
 16         public Node(){
 17             this(null, null);
 18         }
 19 
 20         @Override
 21         public String toString(){
 22             return e.toString();
 23         }
 24     }
 25 
 26     private Node dummyHead;
 27     private int size;
 28 
 29     public LinkedList(){
 30         dummyHead = new Node();
 31         size = 0;
 32     }
 33 
 34     // 获取链表中的元素个数
 35     public int getSize(){
 36         return size;
 37     }
 38 
 39     // 返回链表是否为空
 40     public boolean isEmpty(){
 41         return size == 0;
 42     }
 43 
 44     // 在链表的index(0-based)位置添加新的元素e
 45     // 在链表中不是一个常用的操作,练习用:)
 46     public void add(int index, E e){
 47 
 48         if(index < 0 || index > size)
 49             throw new IllegalArgumentException("Add failed. Illegal index.");
 50 
 51         Node prev = dummyHead;
 52         for(int i = 0 ; i < index ; i ++)
 53             prev = prev.next;
 54 
 55         prev.next = new Node(e, prev.next);
 56         size ++;
 57     }
 58 
 59     // 在链表头添加新的元素e
 60     public void addFirst(E e){
 61         add(0, e);
 62     }
 63 
 64     // 在链表末尾添加新的元素e
 65     public void addLast(E e){
 66         add(size, e);
 67     }
 68 
 69     // 获得链表的第index(0-based)个位置的元素
 70     // 在链表中不是一个常用的操作,练习用:)
 71     public E get(int index){
 72 
 73         if(index < 0 || index >= size)
 74             throw new IllegalArgumentException("Get failed. Illegal index.");
 75 
 76         Node cur = dummyHead.next;
 77         for(int i = 0 ; i < index ; i ++)
 78             cur = cur.next;
 79         return cur.e;
 80     }
 81 
 82     // 获得链表的第一个元素
 83     public E getFirst(){
 84         return get(0);
 85     }
 86 
 87     // 获得链表的最后一个元素
 88     public E getLast(){
 89         return get(size - 1);
 90     }
 91 
 92     // 修改链表的第index(0-based)个位置的元素为e
 93     // 在链表中不是一个常用的操作,练习用:)
 94     public void set(int index, E e){
 95         if(index < 0 || index >= size)
 96             throw new IllegalArgumentException("Update failed. Illegal index.");
 97 
 98         Node cur = dummyHead.next;
 99         for(int i = 0 ; i < index ; i ++)
100             cur = cur.next;
101         cur.e = e;
102     }
103 
104     // 查找链表中是否有元素e
105     public boolean contains(E e){
106         Node cur = dummyHead.next;
107         while(cur != null){
108             if(cur.e.equals(e))
109                 return true;
110             cur = cur.next;
111         }
112         return false;
113     }
114 
115     // 从链表中删除index(0-based)位置的元素, 返回删除的元素
116     // 在链表中不是一个常用的操作,练习用:)
117     public E remove(int index){
118         if(index < 0 || index >= size)
119             throw new IllegalArgumentException("Remove failed. Index is illegal.");
120 
121         // E ret = findNode(index).e; // 两次遍历
122 
123         Node prev = dummyHead;
124         for(int i = 0 ; i < index ; i ++)
125             prev = prev.next;
126 
127         Node retNode = prev.next;
128         prev.next = retNode.next;
129         retNode.next = null;
130         size --;
131 
132         return retNode.e;
133     }
134 
135     // 从链表中删除第一个元素, 返回删除的元素
136     public E removeFirst(){
137         return remove(0);
138     }
139 
140     // 从链表中删除最后一个元素, 返回删除的元素
141     public E removeLast(){
142         return remove(size - 1);
143     }
144 
145     // 从链表中删除元素e
146     public void removeElement(E e){
147 
148         Node prev = dummyHead;
149         while(prev.next != null){
150             if(prev.next.e.equals(e))
151                 break;
152             prev = prev.next;
153         }
154 
155         if(prev.next != null){
156             Node delNode = prev.next;
157             prev.next = delNode.next;
158             delNode.next = null;
159             size --;
160         }
161     }
162 
163     @Override
164     public String toString(){
165         StringBuilder res = new StringBuilder();
166 
167         Node cur = dummyHead.next;
168         while(cur != null){
169             res.append(cur + "->");
170             cur = cur.next;
171         }
172         res.append("NULL");
173 
174         return res.toString();
175     }
176 }
原文地址:https://www.cnblogs.com/mingmingmomo/p/9288932.html