棧簡介
- 棧(Stack)是一種插入刪除操作都只能在一個位置上進行,這個位- 置位於表的末端,叫做棧頂(Top);
- 對棧的基本操作有push和pop,表示進棧和出棧.也就相當於插入和刪除操作;
- 棧結構又叫做LIFO(後進先出)表.歸根結底是一個表結構,因此任何能夠實現表結構的方法都能實現棧;
- 在java語言中,ArrayList和LinkedList都支持棧操作,棧操作都是常數時間的操作,棧的實現方式一般有兩種,一種是使用順序存儲的方式,即使用數組來實現,用ArrayList可以輕易實現棧結構,也可以自己使用數組來實現,一會下面我就用數組來實現棧,第二種是使用鏈式存儲實現,即可以使用LinkedList來實現.
基於數組實現的棧
/*
* 後進先出(LIFO)或先進後出
* 方法:
* 1.進棧 push()
* 2.出棧 pop()
* 3. 獲取棧頂元素 peek()
* 4. 棧的大小 size
* 5. 擴容
* 使用泛型,以便棧中能夠存儲我們想要的數據
* 基於數組的棧實現
*/
public class MyStack<E> {
private Object[] stack;
/*棧中元素的個數,這裏沒有對size1進行初始化,
是因爲size是類成員變量,程序在實例化類的時
候會把size初始化爲默認值0
*/
private int size;
public MyStack() {
stack=new Object[10]; //初始長度爲10
}
// 判斷棧是都爲空
public boolean isEmpty() {
return size==0;
}
// 返回棧頂元素
public E peek() {
if(isEmpty()) {
return null;
}
return (E) stack[size-1];
}
public E pop() {
E e = peek(); //獲取棧頂元素
if(size>0) {
stack[size-1]=null; //將出棧後的位置置爲空
size--; //將棧中元素減一
}
return e; //返回棧頂元素
}
// 檢測棧是否滿,滿的話需要擴容
private void ensureCapacity(int size) {
int len = stack.length;
if(size>len) {
int newLen= len+10; //每次擴容增10
stack = Arrays.copyOf(stack, newLen);
}
}
public E push(E e) {
ensureCapacity(size+1); //先進行擴容檢測
stack[size++]=e; //把元素加進數組最後末尾,並將元素個數size加1
return e; //返回該元素
}
public void printStack() {
System.out.println("start print stack....");
for(int index=0;index<size;index++) {
System.out.println(stack[index]);
}
System.out.println("finish!");
}
// 測試
public static void main(String[] args) {
MyStack<String> myStack = new MyStack<String>();
myStack.push("as");
myStack.push("c");
myStack.push("d");
System.out.println(myStack.pop());
myStack.printStack();
}
}