棧,是一種特殊的線性表,其插入及刪除的操作都在線性表的同一端進行。這一端稱為棧頂,另一端稱為棧底。就類似於餐廳里的一摞盤子,后放的盤子在上方,也會先被人拿走。棧具有“后進先出”的邏輯特性。棧在計算機科學中有着廣泛的應用,遞歸函數的實現就利用了棧這種數據結構,在遞歸時,計算機會維護一個遞歸工作棧,當一個遞歸函數被調用時,被調函數的局部變量、形參的值以及一個返回地址就會儲存在遞歸工作棧中。運行時按照后進先出的順序,進行函數執行,完成遞歸操作。編譯原理中也多次使用棧這種數據結構~
棧是一種特殊的線性表,故其在存儲結構上也有鏈式存儲和順序存儲兩種。代碼如下:
/*鏈棧的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(); } }