資料結構-棧<Typescript>
阿新 • • 發佈:2020-12-26
棧
什麼是棧
棧是一種特殊的列表,棧內的元素只能通過列表的一端訪問,這一端稱為棧頂。咖啡廳內的一摞盤子是現實世界中常見的棧的例子。
只能從最上面取盤子,盤子洗淨後,也只能摞在這一摞盤子的最上面。棧被稱為一種後入先出(LIFO,last-in-first-out)的資料結構。
由於棧具有後入先出的特點,所以任何不在棧頂的元素都無法訪問。為了得到棧底的元素,必須先拿掉上面的元素。對棧的兩種主要操
作是將一個元素壓入棧和將一個元素彈出棧。入棧使用 push() 方法,出棧使用 pop() 方法。另一個常用的操作是預覽棧頂的元素。pop()
方法雖然可以訪問棧頂的元素,但是呼叫該方法後,棧頂元素也從棧中被永久性地刪除了。peek() 方法則只返回棧頂元素,而不刪除它。
classStack<T>{ privateitems:Array<T>=[]; /* 向棧裡新增元素 */ publicpush(element:T):void{ this.items.push(element); } /* 從棧內彈出一個元素 */ publicpop():T{ returnthis.items.pop(); } /* 返回棧頂的元素 */ publicpeek():T{ returnthis.items[this.items.length-1]; } /* 判斷棧是否為空 */ publicisEmpty():boolean{ returnthis.items.length==0; }/* 棧長度 */ publicsize():number{ returnthis.items.length; } /* 清空棧 */ publicclear():void{ this.items=[]; } /* 列印棧內所有元素 */ publicprint():void{ console.log(this.items.toString()); } } let stack:Stack<string> = new Stack<string>(); stack.push("yoyo"); stack.push("gigi"); stack.push("vivi"); stack.print();//yoyo,gigi,vivi stack.pop(); stack.print();yoyo,gigi
利用棧解決是否是迴文
迴文是指這樣一種現象:一個單詞、短語或數字,從前往後寫和從後往前寫都是一樣的。 比如,單詞“dad”、“racecar”就是迴文;如果忽略空格和標點
符號,下面這個句子也是回 文,“A man, a plan, a canal: Panama”;數字 1001 也是迴文。 使用棧,可以輕鬆判斷一個字串是否是迴文。我們將拿到
的字串的每個字元按從左至 右的順序壓入棧。當字串中的字元都入棧後,棧內就儲存了一個反轉後的字串,最後 的字元在棧頂,第一個字元在棧底。
利用前面定義的Stack類來判斷給定的字串是否是迴文的程式
function isPalindrome(str:string):boolean{ let s:Stack<string> = new Stack<string>(); let reverseStr:string = ""; for(let i:number = 0; i < str.length; i++){ s.push(str[i]); } while(s.size() > 0){ reverseStr += s.pop(); } if(str == reverseStr){ return true; }else{ return false; } } let arrStr:Array<string> = ["racecar","hello","12321"]; arrStr.forEach((value)=>{ console.log(isPalindrome(value)); })
//true false true