開題:算法
不冒任何險,什麼都不作,什麼也不會有,什麼也不是。
本文目錄數據結構
和隊列同樣,棧也是一種表結構,可是和隊列的「先進先出」不一樣的是棧是「先進後出」的一種數據結構,它更像咱們生活中向箱子裏放東西,後放的在上面,最早被咱們取出來。this
因爲棧是「先進後出」的結構,因此咱們基本上都是對棧頂元素的操做,任何不在棧頂的元素都不能被訪問,爲了獲得棧底的元素,咱們須要刪除棧頂的元素。3d
由以上可知,「出棧」和「入棧」操做是棧中主要的兩個功能, 咱們還須要設置top做爲整個棧的指針,當向棧中壓入元素時,該變量增大,指向最新的元素,有元素出棧時,該變量減少,指向如今的棧頂元素。咱們可能只但願訪問棧頂元素,並不想將它移出棧因此咱們又須要一個getTop方法,再加上clear清除全棧、empty棧是否爲空和length獲取棧長度的方法基本上就知足了咱們對於棧的使用須要。指針
function Inn(){ var items = []; var top = 0; //入棧 this.push = function(obj){ items[top++] = obj; }; //獲取棧頂元素並刪除 this.pop = function(){ return items[--top]; }; //獲取棧頂元素但不刪除 this.getTop = function(){ return items[top -1]; }; //清除棧數據 this.clear = function(){ top = 0; }; //獲取棧的長度 this.length = function(){ return top; }; //棧是否爲空 this.empty = function(){ return top === 0; }; } var i = new Inn(); i.push({ a: 1, b: 2 }); i.push({ c: 3, d: 4 }); console.log(i.length()); console.log(i.pop()); console.log(i.getTop()); console.log(i.length()); i.clear(); console.log(i.length());
輸出結果爲:code
2 {c: 3, d: 4} {a: 1, b: 2} 1 0
實現一個優秀的算法須要一個好的數據結構來支撐,所以咱們能夠用棧來作好多事情,例如咱們作ACM時的判斷迴文blog
把相同的詞彙或句子,在下文中調換位置或顛倒過來,產生首尾迴環的情趣,叫作迴文,也叫回環。(取自百度百科)
咱們只考慮文字對應位置顛倒的狀況,即文字從前日後和從後往前寫都是同樣的狀況。好比單詞「dad」,「racecar」就是迴文;數字1001也是迴文。隊列
使用棧能夠比較輕鬆的去判斷一個字符是不是迴文。咱們能夠將文字從左往右依次壓入棧中,而後將將棧中數據依次彈出造成一個新的字符串,最後判斷兩個字符串是否相等便可。ip
function Inn(){ var items = []; var top = 0; //入棧 this.push = function(obj){ items[top++] = obj; }; //獲取棧頂元素並刪除 this.pop = function(){ return items[--top]; }; //獲取棧頂元素但不刪除 this.getTop = function(){ return items[top -1]; }; //清除棧數據 this.clear = function(){ top = 0; }; //獲取棧的長度 this.length = function(){ return top; }; //棧是否爲空 this.empty = function(){ return top === 0; }; } var inn = new Inn(); var palindrome = '柳庭風靜人眠晝,晝眠人靜風庭柳'; for (var i = 0; i < palindrome.length; i++) { inn.push(palindrome[i]); } var palindrome2 = ''; while(!inn.empty()){ palindrome2 +=inn.pop(); } if (palindrome == palindrome2) { console.log('這是一個迴文字符串'); }else{ console.log('這不是一個迴文字符串'); }
輸出結果爲:字符串
這是一個迴文字符串
在進行實現轉換時咱們先看一下咱們十進制轉換爲二進制的圖
咱們假設將數字n轉換爲以b爲基數的數字,實現步驟以下:
function Inn(){ var items = []; var top = 0; this.push = function(obj){ items[top++] = obj; }; this.pop = function(){ return items[--top]; }; this.getTop = function(){ return items[top -1]; }; this.clear = function(){ top = 0; }; this.length = function(){ return top; }; //棧是否爲空 this.empty = function(){ return top === 0; }; } /******* 進制轉換 *******/ var n = 4396; var inn = new Inn(); do{ inn.push(n % 2); n = Math.floor( n / 2 ); }while(n > 0); var n22 = ''; while(!inn.empty()){ n22 += inn.pop(); } console.log(parseInt(n22));
輸出結果爲:
1000100101100