棧,是一種特殊的線性表,其插入及刪除的操做都在線性表的同一端進行。這一端稱爲棧頂,另外一端稱爲棧底。就相似於餐廳裏的一摞盤子,後放的盤子在上方,也會先被人拿走。棧具備「後進先出」的邏輯特性。棧在計算機科學中有着普遍的應用,遞歸函數的實現就利用了棧這種數據結構,在遞歸時,計算機會維護一個遞歸工做棧,當一個遞歸函數被調用時,被調函數的局部變量、形參的值以及一個返回地址就會儲存在遞歸工做棧中。運行時按照後進先出的順序,進行函數執行,完成遞歸操做。編譯原理中也屢次使用棧這種數據結構~ javascript
棧是一種特殊的線性表,故其在存儲結構上也有鏈式存儲和順序存儲兩種。代碼以下:java
/*鏈棧的JS實現*/ function LinkedStack(){ //節點結構定義 var Node = function(element){ this.element = element; this.next = null; } var length = 0, top; //棧頂指針 //壓棧操做 this.push = function(element){ var node = new Node(element), current; if(!top){ top = node; length++; return true; }else{ node.next = top; top = node; length++; return true; } } //退棧操做 this.pop = function(){ var current = top; if(top){ top = current.next; current.next = null; length--; return current; }else{ return 'null stack'; } } //獲取棧頂節點 this.top = function(){ return top; } //獲取棧長 this.size = function(){ return length; } this.toString = function(){ var string = '', current = top; while(current){ string += current.element; current = current.next; } return string; } //清空棧 this.clear = function(){ top = null; length = 0; return true; } } //順序棧的JS實現 這裏直接使用了JS內置的Array對象 function ArrayStack(){ var arr = []; //壓棧操做 this.push = function(element){ arr.push(element); } //退棧操做 this.pop = function(){ return arr.pop(); } //獲取棧頂元素 this.top = function(){ return arr[arr.length-1]; } //獲取棧長 this.size = function(){ return arr.length; } //清空棧 this.clear = function(){ arr = []; return true; } this.toString = function(){ return arr.toString(); } }