栈和队列是两种不同的底层数据结构,两种数据结构都是线性结构但是却有本质本质上的区别。栈是一种先进后出的储存模式,比如:数据的入栈顺序是A、B、C、D、E、F,但是它的出栈顺序为F、E、D、C、B、A。而在队列中,数据的入栈顺序为A、B、C、D、E、F并且它的出队顺序也为A、B、C、D、E、F那么,我们也可以根据栈与队列的性质在数组的基础上做一个CURD。
下面便是我对栈的一些操作并且加上好理解的注释,我首先设计了一个接口,里面包含了对栈的操作
package stack;
//stack接口
public interface Stack<E> {
void push(E e);
void pop();
E peek();
int getSize();
boolean isEmpty();
}
然后继承这个接口并进行操作:
package stack;
/**
* 栈
* 后进先出(Last In First Out ,简写为LIFO)的数据结构
* 这是一个由数组封装的栈。
* 一般栈有5个操作
* void push(E) 入栈
* void pop() 出栈
* E peek() 查看栈顶元素
* int getSize() 得到元素个数
* boolean isEmpty() 是否为空
* 在这个栈中,为了更好的体现面向对象的思想,我是定义了一个stack的接口的
* 所以会有@Override注解,如果不需要可以把不用加入这个接口。
*/
public class ArrayStack<E> implements Stack<E>{
private E [] array;
private int size;
public ArrayStack(int capacity){
array =(E [])new Object[capacity];
size = 0;
}
public ArrayStack(){
this(10);
}
//入栈
@Override
public void push(E e) {
if (size==array.length){
resize(array.length*2);
}
array[size]=e;
size++;
}
//出栈
@Override
public void pop() {
if (size<=1){
throw new IllegalArgumentException("当前栈为空");
}
if (size==array.length/2){
resize(array.length/4);
}
array[size-1]=null;
size--;
}
@Override
public E peek() {
return array[size-1];
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size==0;
}
public int getCapacity(){
return array.length;
}
public E get(int index){
return array[index];
}
@Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append(String.format("Array: size = %d , capacity = %d\n",size,array.length));
res.append("Stack: ");
res.append("[");
for (int i = 0;i<size ;i++ ){
res.append(array[i]);
if (i !=size-1){
res.append(" ");
}
}
res.append("] top");
return res.toString();
}
//扩容
private void resize(int newCapacity) {
E [] newData = (E [])new Object[newCapacity];
for (int i= 0;i < size ;i++){
newData[i] = array[i];
}
array=newData;
}
public static void main(String[] args) {
ArrayStack<Integer> arrayStack=new ArrayStack<>();
for (int i=0;i<7;i++){
arrayStack.push(i);
System.out.println(arrayStack);
}
System.out.println(arrayStack.peek());
arrayStack.pop();
System.out.println(arrayStack);
}
}