摘要:以數(shù)組的最后一個(gè)元素當(dāng)成棧頂元素。解題思路首先,我們可以把左括號直接壓入棧,不論是小括號中括號還是大括號。拿出棧頂元素,如果與之右括號不匹配,則返回。如果字符串比較完成,沒有返回,則判斷棧是否為空。
我理解的數(shù)據(jù)結(jié)構(gòu)(二)—— 棧(Stack) 一、棧基礎(chǔ)
棧是一種線性結(jié)構(gòu)
相比較數(shù)組,棧對應(yīng)的操作是數(shù)組的子集
只能從一端添加元素,也只能從同一端取出元素,這一端稱為棧頂
棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),LIFO(Last In First Out)
二、棧的應(yīng)用Undo操作(撤銷)
程序調(diào)用所使用的系統(tǒng)棧
三、棧的實(shí)現(xiàn)其實(shí),實(shí)現(xiàn)一個(gè)棧結(jié)構(gòu)非常簡單,我們只需要復(fù)用上一節(jié)我們自己封裝的數(shù)組就可以快速的實(shí)現(xiàn)一個(gè)棧的創(chuàng)建。1. 首先,我們先創(chuàng)建一個(gè)棧的借口,里面聲明我們需要實(shí)現(xiàn)的方法:
以數(shù)組的最后一個(gè)元素當(dāng)成棧頂元素。
public interface Stack{ boolean isEmpty(); int getSize(); // 移除棧頂元素 E pop(); // 查看棧頂元素 E peek(); // 壓入棧 void push(E ele); }
注:這里我們有一個(gè)peek方法,就是查看棧頂元素,所以我們需要給我們自己封裝的數(shù)組類添加一個(gè)查看最后一個(gè)元素的方法:
// 獲取最后一個(gè)元素 public E getLast() { return get(size - 1); }2. 封裝我們自己的棧
public class ArrayStackimplements Stack { private ArrayNew array; public ArrayStack(int capacity) { array = new ArrayNew<>(capacity); } public ArrayStack() { array = new ArrayNew<>(); } public int getCapacity() { return array.getCapacity(); } @Override public int getSize() { return array.getSize(); } @Override public boolean isEmpty() { return array.isEmpty(); } @Override public void push(E ele) { array.addLast(ele); } @Override public E pop() { return array.removeLast(); } @Override public E peek() { return array.getLast(); } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append("Stack: ["); for (int i = 0; i < getSize(); i++) { res.append(array.get(i)); if (getSize() - 1 != i) { res.append(", "); } } res.append("] top"); return res.toString(); } }
注:其中的ArrayNew即是我們在上一節(jié)自己封裝的數(shù)組類,不知道的同學(xué)可以去查看:
我理解的數(shù)據(jù)結(jié)構(gòu)(一)—— 不要小看了數(shù)組
因?yàn)槲以?b>ArrayNew中已經(jīng)實(shí)現(xiàn)了動(dòng)態(tài)數(shù)組,所以不用考慮棧長度的問題,這樣我們就自己封裝了一個(gè)棧(注釋在Stack接口中和ArrayNew類中足夠詳細(xì))。四、用棧去解決《有效的括號》
這是一道leetcode上,編號為20的題目,具體題目描述如下:
給定一個(gè)只包括 "(",")","{","}","[","]" 的字符串,判斷字符串是否有效。 有效字符串需滿足: 1.左括號必須用相同類型的右括號閉合。 2.左括號必須以正確的順序閉合。 注意空字符串可被認(rèn)為是有效字符串。
解題思路
首先,我們可以把左括號直接壓入棧,不論是小括號、中括號還是大括號。
如果拿到的是右括號,則需要做匹配判斷。
拿出棧頂元素,如果與之右括號匹配,則pop出棧頂元素。
拿出棧頂元素,如果與之右括號不匹配,則返回false。
如果字符串比較完成,沒有返回false,則判斷棧是否為空。
為空,返回true,括號匹配成功
不為空,返回false
解題代碼如下:public boolean isValid(String s) { ArrayStack五、棧的復(fù)雜度分析stack = new ArrayStack<>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); // 左括號直接壓入棧 if (c == "(" || c == "[" || c == "{") { stack.push(c); } else { if (stack.isEmpty()) { return false; } char topChar = stack.pop(); if (c == ")" && topChar != "(") { return false; } if (c == "]" && topChar != "[") { return false; } if (c == "}" && topChar != "{") { return false; } } } return stack.isEmpty(); }
方法 | 復(fù)雜度 |
---|---|
push | O(1) 均攤 |
pop | O(1) 均攤 |
peek | O(1) |
getSize | O(1) |
isEmpty | O(1) |
因?yàn)闂5臅r(shí)間復(fù)雜度都是O(1),所以棧的性能是很高的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29276.html
摘要:以數(shù)組的最后一個(gè)元素當(dāng)成棧頂元素。解題思路首先,我們可以把左括號直接壓入棧,不論是小括號中括號還是大括號。拿出棧頂元素,如果與之右括號不匹配,則返回。如果字符串比較完成,沒有返回,則判斷棧是否為空。 我理解的數(shù)據(jù)結(jié)構(gòu)(二)—— 棧(Stack) 一、棧基礎(chǔ) 棧是一種線性結(jié)構(gòu) 相比較數(shù)組,棧對應(yīng)的操作是數(shù)組的子集 只能從一端添加元素,也只能從同一端取出元素,這一端稱為棧頂 棧是一種后...
摘要:一前言上一篇已經(jīng)講過了鏈表實(shí)現(xiàn)單向鏈表了,它跟數(shù)組都是線性結(jié)構(gòu)的基礎(chǔ),本文主要講解線性結(jié)構(gòu)的應(yīng)用棧和隊(duì)列如果寫錯(cuò)的地方希望大家能夠多多體諒并指正哦,如果有更好的理解的方式也希望能夠在評論下留言,讓大家學(xué)習(xí)學(xué)習(xí)二數(shù)據(jù)結(jié)構(gòu)棧就是這么簡單數(shù)據(jù)結(jié)構(gòu) 一、前言 上一篇已經(jīng)講過了鏈表【Java實(shí)現(xiàn)單向鏈表】了,它跟數(shù)組都是線性結(jié)構(gòu)的基礎(chǔ),本文主要講解線性結(jié)構(gòu)的應(yīng)用:棧和隊(duì)列 如果寫錯(cuò)的地方希望大家...
摘要:一實(shí)現(xiàn)一個(gè)棧類基于堆棧的特性,可以用數(shù)組做線性表進(jìn)行存儲(chǔ)。出棧出棧同樣是利用數(shù)組的方法,在數(shù)組尾部推出數(shù)據(jù)。聚合最后,將所有功能聚合后,如下所示,一個(gè)堆棧的數(shù)據(jù)結(jié)構(gòu)就搞定了。堆棧的經(jīng)典算法應(yīng)用,首推就是漢諾塔。 棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。其限制是僅允許在表的一端進(jìn)行插入和刪除運(yùn)算。這一端被稱為棧頂,相對地,把另一端稱為棧底。 一、實(shí)現(xiàn)一個(gè)棧類Stack 基于堆...
閱讀 489·2019-08-30 15:44
閱讀 903·2019-08-30 10:55
閱讀 2737·2019-08-29 15:16
閱讀 943·2019-08-29 13:17
閱讀 2811·2019-08-26 13:27
閱讀 578·2019-08-26 11:53
閱讀 2126·2019-08-23 18:31
閱讀 1893·2019-08-23 18:23