1:棧,lifo -> 後進先出
棧也是一種線性結構
相比數組,棧對應的操做是數組的子集
只能從一段添加元素,也只能從一段取出元素,這一段稱爲棧定 數組
2.棧的應用:
undo操做,撤銷操做
程序調用的系統棧 -> 父函數調用子函數(A -> B - >C -> D),子函數會分別入棧 ,以下
棧頂
[
D
C
B
]
棧底app
// 棧基於數組:ide
package com.xp.cn.study.struct.stack; public class Array<E> { private E[] data; private int size; // 構造函數,傳入數組的容量capacity構造Array public Array(int capacity){ data = (E[])new Object[capacity]; size = 0; } // 無參數的構造函數,默認數組的容量capacity=10 public Array(){ this(10); } // 獲取數組的容量 public int getCapacity(){ return data.length; } // 獲取數組中的元素個數 public int getSize(){ return size; } // 返回數組是否爲空 public boolean isEmpty(){ return size == 0; } // 在index索引的位置插入一個新元素e public void add(int index, E e){ if(index < 0 || index > size) throw new IllegalArgumentException("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 ++; } // 向全部元素後添加一個新元素 public void addLast(E e){ add(size, e); } // 在全部元素前添加一個新元素 public void addFirst(E e){ add(0, e); } // 獲取index索引位置的元素 public E get(int index){ if(index < 0 || index >= size) throw new IllegalArgumentException("Get failed. Index is illegal."); return data[index]; } public E getLast(){ return get(size - 1); } public E getFirst(){ return get(0); } // 修改index索引位置的元素爲e public void set(int index, E e){ if(index < 0 || index >= size) throw new IllegalArgumentException("Set failed. Index is illegal."); data[index] = e; } // 查找數組中是否有元素e public boolean contains(E e){ for(int i = 0 ; i < size ; i ++){ if(data[i].equals(e)) return true; } return false; } // 查找數組中元素e所在的索引,若是不存在元素e,則返回-1 public int find(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) throw new IllegalArgumentException("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 leak if(size == data.length / 4 && data.length / 2 != 0) resize(data.length / 2); return ret; } // 從數組中刪除第一個元素, 返回刪除的元素 public E removeFirst(){ return remove(0); } // 從數組中刪除最後一個元素, 返回刪除的元素 public E removeLast(){ return remove(size - 1); } // 從數組中刪除元素e public void removeElement(E e){ int index = find(e); if(index != -1) remove(index); } @Override public String toString(){ StringBuilder res = new StringBuilder(); 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大小 private void resize(int newCapacity){ E[] newData = (E[])new Object[newCapacity]; for(int i = 0 ; i < size ; i ++) newData[i] = data[i]; data = newData; } }
//棧接口定義函數
package com.xp.cn.study.struct.stack; public interface Stack<E> { /** * 查看棧大小 */ int getSize(); /** * 查看棧頂元素 */ E peek(); /** * 往棧添加元素 */ void push(E e); /** * 移除棧頂元素 */ E pop(); /** * 棧是否爲空 */ boolean isEmpty(); }
//棧接口實現ui
package com.xp.cn.study.struct.stack; public class ArrayStack<E> implements Stack<E> { Array<E> array; public ArrayStack(int capacity) { array = new Array(capacity); } public ArrayStack() { this(10); } @Override public E peek() { return array.getLast(); } @Override public void push(E e) { array.addLast(e); } @Override public E pop() { return array.removeLast(); } public int getCapacity() { return array.getCapacity(); } @Override public boolean isEmpty() { return array.isEmpty(); } @Override public int getSize() { return array.getSize(); } @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(); } }