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

棧是一種特殊的線性表,故其在存儲結構上也有鏈式存儲和順序存儲兩種。代碼如下:
/*鏈棧的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();
}
}
