微信公衆號:程序員Alex
關注可瞭解更多的編程知識。問題或建議,請公衆號留言;
如果你覺得文章對你有幫助,歡迎收藏
棧
堆棧(英語:stack)又稱爲棧或堆疊**,是計算機科學中的一種抽象數據類型,只允許在有序的線性數據集合的一端(稱爲堆棧頂端,英語:top)進行加入數據(英語:push)和移除數據(英語:pop)的運算。因而按照後進先出(LIFO, Last In First Out)的原理運作。
棧的實現
數組實現
鏈表實現
棧的操作
堆棧使用兩種基本操作:推入(壓棧,push)和彈出(彈棧,pop):
- 推入:將數據放入堆棧頂端,堆棧頂端移到新放入的數據。
- 彈出:將堆棧頂端數據移除,堆棧頂端移到移除後的下一筆數據。
棧的特點
堆棧的基本特點:
- 先入後出,後入先出。
- 除頭尾節點之外,每個元素有一個前驅,一個後繼。
代碼實現
棧的數組實現
public class MyStack<T> {
/**
* 棧
*/
private Object[] stack;
/**
* 棧的大小
*/
private int size;
MyStack() {
stack = new Object[10];
}
private void push(T t) {
reSize();
stack[size] = t;
size++;
}
private T pop() {
T t = peek();
if (size > 0) {
size--;
}
return t;
}
private T peek() {
T t = null;
if (size > 0) {
t = (T) stack[size - 1];
}
return t;
}
private void reSize() {
if (stack.length < size + 1) {
Arrays.copyOf(stack, stack.length * 2);
}
}
/**
* 判斷棧是否爲空
*
* @return
*/
private boolean isEmpty() {
return size == 0;
}
public static void main(String[] args) {
MyStack<Integer> stack = new MyStack();
stack.push(1);
int t = stack.pop();
System.out.println(t);
}
}
棧的鏈表實現
public class MyStack2<T> {
@Data
class Node<T> {
private T value;
private Node next;
}
private Node stack;
MyStack2() {
stack = null;
}
/**
* 獲取棧頂數據
*
* @return
*/
private T peek() {
T t = null;
if (Objects.nonNull(stack)) {
t = (T) stack.value;
}
return t;
}
private T pop() {
T t = peek();
Node newHead = stack.next;
stack = newHead;
return t;
}
private void push(T t) {
Node node = new Node();
node.setValue(t);
if (isEmpty()) {
node.setNext(null);
stack = node;
return;
}
Node temp = stack;
node.setNext(temp);
stack = node;
}
private Boolean isEmpty() {
return Objects.isNull(stack);
}
public static void main(String[] args) {
MyStack2<Integer> stack = new MyStack2();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
}
}
時間複雜度
由於所有操作都是在棧頂,所以pop和posh的時間複雜度都是O(1)