|
@@ -0,0 +1,136 @@
|
|
|
+package ch1.sec3;
|
|
|
+
|
|
|
+import java.util.Iterator;
|
|
|
+
|
|
|
+public class Deque<Item> implements Iterable<Item> {
|
|
|
+ private Item[] items;
|
|
|
+ private int size;
|
|
|
+ private int left;
|
|
|
+ private int right;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public DequeIterator iterator() {
|
|
|
+ return new DequeIterator();
|
|
|
+ }
|
|
|
+
|
|
|
+ public Deque() {
|
|
|
+ items = (Item[]) new Object[4];
|
|
|
+ size = 0;
|
|
|
+ left = 0;
|
|
|
+ right = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isEmpty() {
|
|
|
+ return size == 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int size() {
|
|
|
+ return size;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void pushLeft(Item item) {
|
|
|
+ if (size >= items.length) {
|
|
|
+ resize(items.length * 2);
|
|
|
+ }
|
|
|
+ if (!isEmpty()) {
|
|
|
+ left = (left + items.length - 1) % items.length;
|
|
|
+ }
|
|
|
+ items[left] = item;
|
|
|
+ size++;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void pushRight(Item item) {
|
|
|
+ if (size >= items.length) {
|
|
|
+ resize(items.length * 2);
|
|
|
+ }
|
|
|
+ if (!isEmpty()) {
|
|
|
+ right = (right + 1) % items.length;
|
|
|
+ }
|
|
|
+ items[right] = item;
|
|
|
+ size++;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Item popLeft() {
|
|
|
+ if (isEmpty()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ if (size <= items.length / 4) {
|
|
|
+ resize(items.length / 2);
|
|
|
+ }
|
|
|
+ Item item = items[left];
|
|
|
+ items[left] = null;
|
|
|
+ if (size() != 1) {
|
|
|
+ left = (left + 1) % items.length;
|
|
|
+ }
|
|
|
+ size--;
|
|
|
+ return item;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Item popRight() {
|
|
|
+ if (isEmpty()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ if (size <= items.length / 4) {
|
|
|
+ resize(items.length / 2);
|
|
|
+ }
|
|
|
+ Item item = items[right];
|
|
|
+ items[right] = null;
|
|
|
+ if (size() != 1) {
|
|
|
+ right = (right + items.length - 1) % items.length;
|
|
|
+ }
|
|
|
+ size--;
|
|
|
+ return item;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ Deque<Integer> deque = new Deque<>();
|
|
|
+ System.out.println(deque.isEmpty());
|
|
|
+ deque.pushLeft(1);
|
|
|
+ deque.pushLeft(2);
|
|
|
+ deque.pushRight(3);
|
|
|
+ deque.pushRight(4);
|
|
|
+ deque.pushLeft(5);
|
|
|
+ deque.pushRight(6);
|
|
|
+ for (Integer i : deque) {
|
|
|
+ System.out.println(i);
|
|
|
+ }
|
|
|
+ System.out.println(deque.size());
|
|
|
+ while (!deque.isEmpty()) {
|
|
|
+ if (deque.size() % 2 == 0) {
|
|
|
+ System.out.println(deque.popLeft());
|
|
|
+ } else {
|
|
|
+ System.out.println(deque.popRight());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private class DequeIterator implements Iterator<Item> {
|
|
|
+ private int index;
|
|
|
+
|
|
|
+ DequeIterator() {
|
|
|
+ index = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean hasNext() {
|
|
|
+ return index < size;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Item next() {
|
|
|
+ int nextIndex = (left + index) % items.length;
|
|
|
+ index++;
|
|
|
+ return items[nextIndex];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void resize(int newsize) {
|
|
|
+ Item[] newItems = (Item[]) new Object[newsize];
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
+ newItems[i] = items[(left + i) % items.length];
|
|
|
+ }
|
|
|
+ left = 0;
|
|
|
+ right = size == 0 ? 0 : size - 1;
|
|
|
+ items = newItems;
|
|
|
+ }
|
|
|
+}
|