棧是一種經常使用的數據結構,具有先進先出的特點。在Java中,棧分為順序棧和鏈棧兩種類型。它們的實現方式不同,但在棧的基本操作上具有相似性。
順序棧
public class ArrayStack { private Object[] data; // 數據存儲區(qū) private int top; // 棧頂指針 public ArrayStack(int capacity) { this.data = new Object[capacity]; this.top = -1; } // 入棧操作 public boolean push(Object element) { if (isFull()) { return false; } data[++top] = element; return true; } // 出棧操作 public Object pop() { if (isEmpty()) { return null; } return data[top--]; } // 獲取棧頂元素 public Object peek() { if (isEmpty()) { return null; } return data[top]; } // 判斷是否為空棧 public boolean isEmpty() { return top == -1; } // 判斷是否為滿棧 public boolean isFull() { return top == data.length - 1; } }
順序棧使用數組作為數據存儲區(qū),棧頂指針top初始化為-1。在入棧操作中,將棧頂指針先加1,再將元素賦值到數據存儲區(qū)中。在出棧操作中,先返回棧頂元素,再將棧頂指針減1。棧頂指針為-1時,表示棧為空。
鏈棧
public class LinkedStack { private Node top; // 棧頂結點 public LinkedStack() { this.top = null; } // 入棧操作 public boolean push(Object element) { Node newNode = new Node(element); newNode.next = top; top = newNode; return true; } // 出棧操作 public Object pop() { if (isEmpty()) { return null; } Object data = top.data; top = top.next; return data; } // 獲取棧頂元素 public Object peek() { if (isEmpty()) { return null; } return top.data; } // 判斷是否為空棧 public boolean isEmpty() { return top == null; } private class Node { private Object data; private Node next; public Node(Object data) { this.data = data; } } }
鏈棧通過鏈表結構來實現,棧頂指針為首結點。在入棧操作中,新建一個結點,將該結點的next指向當前棧頂結點,然后將該結點作為新的棧頂結點。在出棧操作中,先返回棧頂元素,再將棧頂指針指向下一個結點。棧頂指針為null時,表示棧為空。