01 使用数组类实现栈
先创建了一个栈的接口,然后用数组类实现。这个数组类可以是自己写的也可以Java自带,其实自带的和自己写的一样。
栈接口
package cn.uestc.stack.practice01; public interface Stack<E> { //获得栈中元素个数 O(1) public int getSize(); //判断是否为空 O(1) public boolean isEmpty(); //入栈 O(1)均摊法 public void push(E e); //出栈 O(1)均摊法 public E pop(); //获取栈顶元素 O(1) public E peek(); }
接口的实现
package cn.uestc.stack.practice01; public class ArrayStack<E> implements Stack<E>{ private Array<E> array; //在写构造方法时方法名不用加泛型 public ArrayStack(int capacity) { array = new Array<E>(capacity); } public ArrayStack(){ array = new Array<E>(); } @Override public int getSize() { return array.getSize(); } @Override public boolean isEmpty() { return array.isEmpty(); } //获取容量是在内部使用的,不用提供接口 public int getCapacity() { return array.getCapacity(); } @Override public void push(E e) { array.addLast(e); } @Override public E pop() { return array.removeLast(); } @Override public E peek() { return array.getLast(); } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append("Stack: "); res.append('['); for (int i = 0; i < array.getSize(); i++) { res.append(array.get(i)); if (i != array.getSize() - 1) { res.append(", "); } } res.append("] top"); return res.toString(); } }
02 数组实现队列
同栈一样仍然是接口--实现的方法
队列的接口
package cn.uestc.queue; public interface Queue<E> { //获得队列中的元素个数 O(1) public int getSize(); //判断是否为空 O(1) public boolean isEmpty(); //进入一个元素 O(1) public void enqueue(E e); //出一个元素 O(n) 涉及到后面元素的移动 public E dequeue(); //获得对首元素 O(1) public E getFront(); }
接口实现
package cn.uestc.queue; public class ArrayQueue<E> implements Queue<E> { private Array<E> array; public ArrayQueue(int capacity) { array = new Array<>(capacity); } public ArrayQueue() { array = new Array<>(); } @Override public int getSize() { return array.getSize(); } @Override public boolean isEmpty() { return array.isEmpty(); } // 获取队列的容量 public int getCapacity() { return array.getCapacity(); } @Override public void enqueue(E e) { array.addLast(e); } @Override public E dequeue() { return array.removeFirst(); } @Override public E getFront() { return array.getFirst(); } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append("Queue: "); res.append("front ["); for(int i = 0;i < array.getSize(); i++) { res.append(array.get(i)); if (i != array.getSize()-1) { res.append(", "); } } res.append("] tail"); return res.toString(); } }
对队列进行改造,实现循环队列
package cn.uestc.queue; public class LoopQueue<E> implements Queue<E> { //盛放元素的数组 private E[] data; //首尾指针 private int front,tail; //实际容量,其实可以通过首尾指针计算出来,但比较麻烦,多声明一个变量节省了逻辑 private int size; public LoopQueue(int capacity) { //之所以加1是因为在判断满时会浪费1个空间 data = (E[]) new Object[capacity + 1]; front = 0; tail = 0; size = 0; } public LoopQueue() { this(10); } public int getCapacity() { //同样是空间浪费减1 return data.length - 1; } @Override public int getSize() { return size; } @Override public boolean isEmpty() { return front == tail; } @Override public void enqueue(E e) { if ((tail + 1) % data.length == front) { resize(getCapacity() * 2); } data[tail] = e; tail = (tail + 1) % data.length; size++; } @Override public E dequeue() { if (isEmpty()) { throw new IllegalArgumentException("Cannot dequeue from an empty queue."); } E ret = data[front]; data[front] = null; front = (front + 1) % data.length; size--; if (size == getCapacity() / 4 && getCapacity() / 2 !=0) { resize(getCapacity()/2); } return ret; } @Override public E getFront() { if (isEmpty()) { throw new IllegalArgumentException("Queue is empty."); } return data[front]; } public void resize(int newCapacity) { E[] newData = (E[])new Object[newCapacity + 1]; for (int i = 0; i < size; i++) { //要实现循环,这个front不一定是从0开始的 newData[i] = data[(i+front) % data.length]; } data = newData; front = 0; tail = size; } @Override public String toString(){ StringBuilder res = new StringBuilder(); res.append(String.format("Queue: size = %d , capacity = %d ", size, getCapacity())); res.append("front ["); for(int i = front ; i != tail ; i = (i + 1) % data.length){ res.append(data[i]); if((i + 1) % data.length != tail) res.append(", "); } res.append("] tail"); return res.toString(); } }
0