stack,中文翻譯爲堆棧,其實指的是棧,heap,堆。這裏講的是數據結構的棧,不是內存分配裏面的堆和棧。node
棧是先進後出的數據的結構,比如你碟子一個一個堆起來,最後放的那個是堆在最上面的。數組
棧是一種用於存儲數據的簡單數據結構,有點相似鏈表或者順序表(統稱線性表),棧與線性表的最大區別是數據的存取的操做,咱們能夠這樣認爲棧(Stack)是一種特殊的數據結構
線性表,其插入和刪除操做只容許在線性表的一端進行,通常而言,把容許操做的一端稱爲棧頂(Top),不可操做的一端稱爲棧底(Bottom),同時把插入元素的操做稱爲入棧this
(Push),刪除元素的操做稱爲出棧(Pop)。若棧中沒有任何元素,則稱爲空棧。spa
順序棧翻譯
順序棧,顧名思義就是採用順序表實現的的棧,順序棧的內部以順序表爲基礎,實現對元素的存取操做,固然咱們還能夠採用內部數組實現順序棧,在這裏咱們使用內部數據code
組來實現棧blog
package com.demo.stack; public class SeqStack { private int top = -1; private int capacity = 10; private int[] array; private int size; public SeqStack(int capacity){ array = new int[capacity]; } public SeqStack(){ array = new int[this.capacity]; } public int size(){ return size; } public boolean isEmpty(){ return this.top == -1; } public void push(int data){ if(array.length == size){ addCapacity(size*2); } array[++top] = data; size++; } public int pop(){ if(isEmpty()){ return -1; } size--; array[top] = (Integer) null; return array[top--]; } public void addCapacity(int capacity){ if(capacity < size){ return; } int[] old = array; array = new int[capacity]; for(int i=0; i<size; i++){ array[i] = old[i]; } } }
鏈式棧內存
瞭解完順序棧,咱們接着來看看鏈式棧,所謂的鏈式棧(Linked Stack),就是採用鏈式存儲結構的棧,因爲咱們操做的是棧頂一端,所以這裏採用單鏈表(不帶頭結點)ci
做爲基礎,直接實現棧的添加,獲取,刪除等主要操做便可。
package com.demo.node; public class Node { public int data; public Node next = null; public Node(int data){ this.data = data; } public Node(int data, Node node){ this.data = data; this.next = node; } }
package com.demo.stack; import com.demo.node.Node; public class LinkedStack { private Node top; private int size; public LinkedStack(){ this.top = null; } public int size(){ return this.size; } public void push(int data) throws Exception{ if(this.top == null){ this.top = new Node(data); }else{ Node p = new Node(data,this.top); top = p; } size++; } public int pop(){ int data = top.data; top = top.next; size--; return data; } }