使用链表实现栈
使用链表实现栈
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 }