栈也是一种线性结构。
相比数组,栈对应的操作是数组的子集。
只能从一端添加元素,也只能从同一端取出元素。这一端称为栈顶。
栈是一种后进先出的数据结构
Last In First Out(LIFO)
栈的应用
无处不在的Undo操作(撤销)
程序调用的系统栈,记录程序的调用过程。
publicinterfaceStack<E>{intgetSize();booleanisEmpty();voidpush(E e);
E pop();
E peek();}
ArrayStack
publicclassArrayStack<E>implementsStack<E>{private Array<E> array;// 构造大小为capacity的数组栈publicArrayStack(int capacity){
array =newArray<>(capacity);}publicArrayStack(){
array =newArray<>();}// 栈的大小@OverridepublicintgetSize(){return array.getSize();}// 栈是否为空@OverridepublicbooleanisEmpty(){return array.isEmpty();}// 栈的容量publicintgetCapacity(){return array.getCapacity();}// 栈中压入一个元素@Overridepublicvoidpush(E e){
array.addLast(e);}// 出栈@Overridepublic E pop(){return array.removeLast();}// 查看栈顶元素@Overridepublic E peek(){return array.getLast();}@Overridepublic String toString(){
StringBuilder res =newStringBuilder();
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();}}
Test
publicclassMain{publicstaticvoidmain(String[] args){
ArrayStack<Integer> stack =newArrayStack<>();for(int i =0; i <5; i++){
stack.push(i);
System.out.println(stack);}
stack.pop();
System.out.println(stack);}}
Sout
Stack:[0] top
Stack:[0,1] top
Stack:[0,1,2] top
Stack:[0,1,2,3] top
Stack:[0,1,2,3,4] top
Stack:[0,1,2,3] top
Array
publicclassArray<E>{private E[] data;privateint size;// 构造函数,传入数组的容量capacity构造ArraypublicArray(int capacity){
data =(E[])newObject[capacity];
size =0;}// 无参数的构造函数,默认数组的容量capacity=10publicArray(){this(10);}// 获取数组的容量publicintgetCapacity(){return data.length;}// 获取数组中的元素个数publicintgetSize(){return size;}// 返回数组是否为空publicbooleanisEmpty(){return size ==0;}// 在index索引的位置插入一个新元素epublicvoidadd(int index, E e){if(index <0|| index > size)thrownewIllegalArgumentException("Add failed. Require index >= 0 and index <= size.");if(size == data.length)resize(2* data.length);for(int i = size -1; i >= index ; i --)
data[i +1]= data[i];
data[index]= e;
size ++;}// 向所有元素后添加一个新元素publicvoidaddLast(E e){add(size, e);}// 在所有元素前添加一个新元素publicvoidaddFirst(E e){add(0, e);}// 获取index索引位置的元素public E get(int index){if(index <0|| index >= size)thrownewIllegalArgumentException("Get failed. Index is illegal.");return data[index];}public E getLast(){returnget(size -1);}public E getFirst(){returnget(0);}// 修改index索引位置的元素为epublicvoidset(int index, E e){if(index <0|| index >= size)thrownewIllegalArgumentException("Set failed. Index is illegal.");
data[index]= e;}// 查找数组中是否有元素epublicbooleancontains(E e){for(int i =0; i < size ; i ++){if(data[i].equals(e))returntrue;}returnfalse;}// 查找数组中元素e所在的索引,如果不存在元素e,则返回-1publicintfind(E e){for(int i =0; i < size ; i ++){if(data[i].equals(e))return i;}return-1;}// 从数组中删除index位置的元素, 返回删除的元素public E remove(int index){if(index <0|| index >= size)thrownewIllegalArgumentException("Remove failed. Index is illegal.");
E ret = data[index];for(int i = index +1; i < size ; i ++)
data[i -1]= data[i];
size --;
data[size]= null;// loitering objects != memory leakif(size == data.length /4&& data.length /2!=0)resize(data.length /2);return ret;}// 从数组中删除第一个元素, 返回删除的元素public E removeFirst(){returnremove(0);}// 从数组中删除最后一个元素, 返回删除的元素public E removeLast(){returnremove(size -1);}// 从数组中删除元素epublicvoidremoveElement(E e){int index =find(e);if(index !=-1)remove(index);}@Overridepublic String toString(){
StringBuilder res =newStringBuilder();
res.append(String.format("Array: size = %d , capacity = %d\n", size, data.length));
res.append('[');for(int i =0; i < size ; i ++){
res.append(data[i]);if(i != size -1)
res.append(", ");}
res.append(']');return res.toString();}// 将数组空间的容量变成newCapacity大小privatevoidresize(int newCapacity){
E[] newData =(E[])newObject[newCapacity];for(int i =0; i < size ; i ++)
newData[i]= data[i];
data = newData;}}