棧的定義
- 棧(stack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧頂(top),有的稱爲限定性的限制表結構。棧有時也叫做 LIFO (後進先出)表。
數組實現棧
- 使用數組實現棧
優點:一個元素佔用一個存儲空間;
缺點:如果初始化申請的存儲空間太大,浪費存儲空間。如果申請的存儲空間太小,如果後期需要擴充空間,擴充是一個費時的操作,這樣會造成性能的下降。
-
時間複雜度爲 O(1)
-
代碼如下:
/**
* 數組方式實現棧
*/
public class MyStack<T> {
// 定義數組存放數據
private ArrayList<T> arr;
// 定義棧的大小
private int stackSize;
public MyStack() {
arr = new ArrayList<>();
stackSize = 0;
}
/**
* 判斷是否是null
*/
boolean isEmpty() {
return stackSize == 0;
}
/**
* 獲取棧大小
*/
int size() {
return stackSize;
}
/**
* 獲取棧頂元素
*/
T top() {
if (isEmpty()) {
return null;
}
return arr.get(stackSize - 1);
}
/**
* 彈棧
*/
T pop() {
if (stackSize > 0) {
return arr.get(--stackSize);
} else {
System.out.println("棧爲null");
return null;
}
}
/**
* 壓棧
*/
void push(T item){
stackSize++;
arr.add(item);
}
}
- 調用如下:
@Test
public void test() {
MyStack<Integer> myStack = new MyStack<>();
myStack.push(1);
myStack.push(2);
myStack.push(3);
System.out.println("棧頂元素爲:" + myStack.top());
System.out.println("棧大小爲:" + myStack.size());
myStack.pop();
System.out.println("彈棧成功");
System.out.println("棧大小爲:" + myStack.size());
System.out.println("棧頂元素爲:" + myStack.top());
}
鏈表實現棧
- 優缺點
優點:使用靈活方便,只有在需要的時候才申請存儲空間。
缺點:除了要存儲元素外,還要額外的存儲指針信息。
-
時間複雜度爲 O(1)
-
棧實現如下:
/**
* 鏈表方式實現棧
*/
public class MyStack2<T> {
static class LNode<T> {
T data;
LNode<T> next;
}
private LNode<T> head;
public MyStack2() {
head = new LNode<T>();
head.data = null;
head.next = null;
}
/**
* 棧是否爲null
*/
boolean empty() {
return head == null;
}
/**
* 大小
*/
int size() {
int size = 0;
LNode<T> node = head.next;
while (node != null) {
node = node.next;
size++;
}
return size;
}
T top() {
if (head == null || head.next == null) {
return null;
}
return head.next.data;
}
T pop() {
LNode<T> tmp = head.next;
if (tmp != null) {
head.next = tmp.next;
return tmp.data;
}
System.out.println("棧爲null");
return null;
}
void push(T item) {
LNode<T> addItem = new LNode<>();
addItem.data = item;
addItem.next = head.next;
head.next = addItem;
}
}
- 調用如下:
@Test
public void test2() {
MyStack2<Integer> myStack = new MyStack2<>();
myStack.push(1);
myStack.push(2);
myStack.push(3);
System.out.println("棧頂元素爲:" + myStack.top());
System.out.println("棧大小爲:" + myStack.size());
myStack.pop();
System.out.println("彈棧成功");
System.out.println("棧大小爲:" + myStack.size());
System.out.println("棧頂元素爲:" + myStack.top());
}