碼棧有哪些功能?解析堆棧的主要作用是什么

一、「 堆棧 」是什么? 堆棧(stack)是一種先進(jìn)后出的、操作受限的線性表,也可以直接稱為
碼棧有哪些功能?解析堆棧的主要作用是什么

可以把棧想象成一個桶一樣,往這個桶里面一層一層的放東西,先放進(jìn)去的在里面,后放進(jìn)去的東西依次在外面。但取東西的時候就是先取靠近外面的,再依次一層層取里面的。這就是 后進(jìn)先出( Last In-First Out )的原則。 因此「 棧 」雖然是線性的,有2個端:頂端和底端,但它只允許從一端進(jìn)行插入和刪除數(shù)據(jù),這就是為啥前面說「 棧 」是操作受限的了。 只有兩種操作:Push 和 Pop 。我們用Push(壓入)來表示往棧中插入數(shù)據(jù),也叫入棧,用Pop(彈出)來表示從棧中刪除數(shù)據(jù),也叫出棧。我們可以既可以用 「 數(shù)組 」 來實(shí)現(xiàn)一個棧,也可以用 「 鏈表 」 來實(shí)現(xiàn)一個棧。
  • 用數(shù)組實(shí)現(xiàn)的棧,叫做 順序棧
  • 順序棧的實(shí)現(xiàn)非常簡單,這里就不寫代碼了,寫一下思路。先初始化一個數(shù)組,然后再用一個變量給這個數(shù)組里的元素進(jìn)行計(jì)數(shù),當(dāng)有新元素需要入棧的時候,將這個新元素寫入到數(shù)組的最后一個元素的后面,然后計(jì)數(shù)器加一。當(dāng)需要做出棧操作時,將數(shù)組中最后一個元素返回,計(jì)數(shù)器減一。
  • 當(dāng)然在入棧前需要判斷數(shù)組是否已經(jīng)滿了,如果數(shù)組大小等于計(jì)數(shù)器大小,則表明數(shù)組是滿的。
  • 出棧的時候也需要判斷數(shù)組是不是空數(shù)組,如果計(jì)數(shù)器是0,則表明數(shù)組是空的。
  • 從上面的實(shí)現(xiàn)流程可以看出,通過數(shù)組實(shí)現(xiàn)的棧,其入棧和出棧都是對單個元素進(jìn)行操作,因此其入棧和出棧的時間復(fù)雜度都是O(1),并且其入棧和出棧操作并沒有額外開銷更多空間,因此其空間復(fù)雜度也是O(1)的。
  • 用鏈表實(shí)現(xiàn)的棧,叫做 鏈?zhǔn)綏?/strong>:
  • 實(shí)現(xiàn)思路是先定義一個鏈表節(jié)點(diǎn)的類,基于這個類去定義一個頭節(jié)點(diǎn)Head。當(dāng)有新元素需要入棧的時候,將這個新元素的Next指針指向頭結(jié)點(diǎn)Head的Next節(jié)點(diǎn),然后再將Head的Next指向這個新節(jié)點(diǎn)。當(dāng)需要做出棧操作時,直接將Head所指向的節(jié)點(diǎn)返回,同時讓Head指向下一個節(jié)點(diǎn)。
  • 當(dāng)然,在入棧和出棧時都需要判斷鏈表是否為空的情況。
  • 鏈?zhǔn)綏5娜霔:统鰲6际窃谔幚眍^部節(jié)點(diǎn),所以操作很簡單,其時間和空間復(fù)雜度均為O(1)。
二、「 堆棧 」的算法實(shí)踐? 我們來看一個基于用 來完成的 算法題(來源leetcode)
算法題:給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需滿足:
 左括號必須用相同類型的右括號閉合。
 左括號必須以正確的順序閉合。
舉例:字符串 "()"有效、"()[]{}"有效、"(]"無效、"([)]"無效、"{[]}"有效。
解題思路:
使用1個堆棧即可解決,依次遍歷這個字符串,如果遇到是左括號就入棧到堆棧中,如果遇到的是右括號,則從堆棧中取出棧頂?shù)牡谝粋€左括號,比對一下這個左括號和當(dāng)前遇到的右括號是否匹配,如果不匹配這認(rèn)為這整個字符串無效。如果能匹配,則OK,刪除這個左括號和右括號,繼續(xù)往后走,繼續(xù)遍歷字符串中剩下的字符,只要遇到左括號就入棧,只要遇到右括號就與將棧頂?shù)淖罄ㄌ柍鰲Ec之比較。一直走到字符串結(jié)束,再來檢查堆棧中是否還有元素,如果還有元素,則這個字符串同樣無效,如果堆棧為空,則字符串有效。
就以這個思路實(shí)現(xiàn)一個初版代碼:
class Solution {
 public boolean isValid(String s) {
 Stack<Character> satck = new Stack<Character>();
 for(int i=0; i<s.length();i++){
 char c = s.charAt(i);
 if(c=='(' || c=='{' || c=='['){
 satck.push(c);
 }else{
 if(satck.isEmpty()) return false;
 char temp = satck.pop();
 if( (temp=='('&&c==')') || (temp=='{'&&c=='}') || (temp=='['&&c==']') ){
 continue;
 }else{
 return false;
 }
 }
 }
 return satck.isEmpty();
 }
}
這個代碼的時間復(fù)雜度o(n),空間復(fù)雜度o(n)搞定。
但是想了想,好像代碼不是很優(yōu)雅,寫了一個優(yōu)化版,提前將左右括號放入到MAP中,這個方法的時間和空間復(fù)雜度跟上面的一樣。
class Solution {
 public boolean isValid(String s) {
 Stack<Character> stack = new Stack<Character>();
 HashMap<Character,Character> map = new HashMap<Character,Character>();
 map.put('(', ')');
 map.put('{','}' );
 map.put('[', ']');
 for(int i=0;i<s.length();i++){
 char c = s.charAt(i);
 if(map.containsKey(c)){
 stack.push(c);
 }else{
 if(stack.isEmpty()) return false;
 char temp = stack.pop();
 if(map.get(temp)!=c) return false;
 }
 } 
 return stack.isEmpty();
 }
}
繼續(xù)思考有沒有更簡潔的方法,竟然在leetcode上找到了一個:
但是這個方法并沒有用到堆棧哦,它的思路是不斷的遍歷這個字符串,將字符串中的(){}[]全部調(diào)換成空字符串,如果最后全部替換完成了,并且字符串為空了,就說明字符串是有效的,否者就是無效的字符串。
class Solution {
 public boolean isValid(String s) {
 int length = s.length();
 do{
 length = s.length();
 s = s.replaceAll("\\(\\)","").replaceAll("\\{\\}","").replaceAll("\\[\\]","");
 }while(s.length()!=length);
 return s.length()==0;
 }
}
不過這個方法的時間復(fù)雜度要高一些。
以上,就是對數(shù)據(jù)結(jié)構(gòu)中「 堆棧 」的一些思考。 碼字不易啊,喜歡的話不妨轉(zhuǎn)發(fā)朋友,或點(diǎn)擊文章右下角的“在看”吧。
本文原創(chuàng)發(fā)布于微信公眾號「 不止思考 」,歡迎關(guān)注。涉及 思維認(rèn)知、個人成長、架構(gòu)、大數(shù)據(jù)、Web技術(shù) 等。

聲明:本文由網(wǎng)站用戶香香發(fā)表,超夢電商平臺僅提供信息存儲服務(wù),版權(quán)歸原作者所有。若發(fā)現(xiàn)本站文章存在版權(quán)問題,如發(fā)現(xiàn)文章、圖片等侵權(quán)行為,請聯(lián)系我們刪除。

(0)
上一篇 2023年3月23日 08:06:09
下一篇 2023年3月23日 08:16:12

相關(guān)推薦

發(fā)表回復(fù)

您的電子郵箱地址不會被公開。 必填項(xiàng)已用*標(biāo)注

主站蜘蛛池模板: 免费va欧美在线观看| 国产成人精品久久| 一本之道在线视频| 日本亚洲色大成网站www久久| 亚洲国产夜色在线观看| 消息称老熟妇乱视频一区二区| 成人av鲁丝片一区二区免费 | 久久综合丝袜长腿丝袜| 国产精品视频观看| 99久re热视频这里只有精品6| 嫩草影院在线播放www免费观看| 丰满人妻一区二区三区视频53| 日韩人妻无码一区二区三区综合部 | 亚洲精品你懂的| 狠狠久久亚洲欧美专区| 免费在线视频你懂的| 精品无码一区二区三区| 四虎影院永久网址| 色狠台湾色综合网站| 国产人妖ts在线观看网站| 黄色网站在线观看视频| 天天操天天干天天拍| 一级有奶水毛片免费看| 成年免费a级毛片免费看无码 | 亚洲国产美女精品久久久久| 污污网站免费入口链接| 亚洲高清资源在线观看| 狠狠色综合网久久久久久| 偷炮少妇宾馆半推半就激情| 疯狂奶水freeseⅹ| 免费床戏全程无遮挡在线观看| 精品国产一区二区三区久久狼| 又色又污又黄无遮挡的免费视| 老司机67194精品线观看| 国产zzjjzzjj视频全免费| 被义子侵犯的漂亮人妻中字| 国产亚洲精品拍拍拍拍拍| 青娱乐精品视频在线观看| 国产亚洲欧美日韩在线观看一区二区| 香港三级电影在线观看| 国产剧情一区二区三区|