|
111 | 111 | Integer size();
|
112 | 112 | }
|
113 | 113 |
|
| 114 | + ->FIFO队列,通过单向链表实现,新的节点从链表的尾部插入,从链表的头部移出。 |
| 115 | + 实现:ca.mcmaster.chapter.one.FIFO.ListFIFOQueue<T> |
| 116 | + public class ListFIFOQueue<T> implements FifoQueue<T> { |
| 117 | + private Node first; |
| 118 | + private Node last; |
| 119 | + private Integer size = 0; |
| 120 | + private class Node{ |
| 121 | + T t; |
| 122 | + Node next; |
| 123 | + } |
| 124 | + public void enqueue(T t) { |
| 125 | + Node oldLast = last; |
| 126 | + last = new Node(); |
| 127 | + last.t = t; |
| 128 | + last.next = null; |
| 129 | + if(isEmpty()) first = last; |
| 130 | + else oldLast.next = last; |
| 131 | + size ++; |
| 132 | + } |
| 133 | + public T dequeue() { |
| 134 | + if(isEmpty()) throw new IndexOutOfBoundsException(); |
| 135 | + T t = first.t; |
| 136 | + first = first.next; |
| 137 | + size--; |
| 138 | + if(size.equals(0)) last = null; |
| 139 | + return t; |
| 140 | + } |
| 141 | + public Boolean isEmpty() { return size.equals(0); } |
| 142 | + public Integer size() { return size; } |
| 143 | + } |
| 144 | + |
114 | 145 | 11. 栈 LIFO队列:
|
115 | 146 | 接口:ca.mcmaster.chapter.one.stuck.Stack<T>
|
116 | 147 | public interface MyStack<T>{
|
|
120 | 151 | Integer size();
|
121 | 152 | }
|
122 | 153 |
|
123 |
| - ->定容字符串栈: |
124 |
| - public class FixedCapacityStackOfString<T> implements MyStack<T> { |
| 154 | + ->LIFO栈 可动态调整数组大小栈: |
| 155 | + 实现:ca.mcmaster.chapter.one.stack.ResizingArrayStack<T> |
| 156 | + public class ResizingArrayStack<T> implements MyStack<T> { |
125 | 157 | private T[] a;
|
126 | 158 | private int size;
|
127 |
| - public FixedCapacityStackOfString(int capacity){ a = (T[])new Object[capacity]; } //无法泛型数组,所以创建一个Object类,再转型为泛型类。 |
| 159 | + public ResizingArrayStack(int capacity){ a = (T[])new Object[capacity]; } //无法泛型数组,所以创建一个Object类,再转型为泛型类。 |
128 | 160 | public void push(T t) {
|
129 | 161 | if(size == a.length)
|
130 | 162 | this.resize(a.length * 2);
|
|
142 | 174 | for(int i = 0; i < size; i++)
|
143 | 175 | temp[i] = a[i];
|
144 | 176 | a = temp;
|
145 |
| - } |
| 177 | + } |
| 178 | + private class ReverseArrayIterator implements Iterator<T>{ |
| 179 | + public boolean hasNext() { return size > 0; } |
| 180 | + public T next() { return a[--size]; } |
| 181 | + public void remove() {} |
| 182 | + } |
| 183 | + |
| 184 | + public Iterator<T> iterator() { |
| 185 | + return new ReverseArrayIterator(); |
| 186 | + } |
| 187 | + } |
| 188 | + *内部类: |
| 189 | + ->当前的ReverseArrayIterator就是一个内部类,该类拥有所有对外部类的field的操作权限,并且可以在外部类内部被调用。 |
| 190 | + ->如果外部需要该内部类对象,可以构造一个public的访问器。 |
| 191 | + ->**如果因为内部类和泛型的问题不知道怎么接收到参数,可以考虑使用多态,利用接口接受参数。 |
| 192 | + |
| 193 | + ->通过单向链表实现的LIFO栈: |
| 194 | + 实现:ca.mcmaster.chapter.one.stack.ListStack<T> |
| 195 | + public class ListStack<T> implements MyStack<T> { |
| 196 | + private Node first; |
| 197 | + private Integer size = 0; |
| 198 | + private class Node{ |
| 199 | + T t; |
| 200 | + Node next; |
| 201 | + } |
| 202 | + public void push(T t) { |
| 203 | + Node oldFirst = first; |
| 204 | + first = new Node(); |
| 205 | + first.t = t; |
| 206 | + first.next = oldFirst; |
| 207 | + size++; |
| 208 | + } |
| 209 | + public T pop() { |
| 210 | + if(size.equals(0)) throw new IndexOutOfBoundsException(); |
| 211 | + T t = first.t; |
| 212 | + first = first.next; |
| 213 | + size--; |
| 214 | + return t; |
| 215 | + } |
| 216 | + public Boolean isEmpty() { return size.equals(0); }; |
| 217 | + public Integer size() { return size; } |
146 | 218 | }
|
147 | 219 |
|
148 | 220 | 12. 装箱拆箱:
|
|
0 commit comments