摘要:以數組的最后一個元素當成棧頂元素。解題思路首先,我們可以把左括號直接壓入棧,不論是小括號中括號還是大括號。拿出棧頂元素,如果與之右括號不匹配,則返回。如果字符串比較完成,沒有返回,則判斷棧是否為空。
我理解的數據結構(二)—— 棧(Stack) 一、棧基礎
棧是一種線性結構
相比較數組,棧對應的操作是數組的子集
只能從一端添加元素,也只能從同一端取出元素,這一端稱為棧頂
棧是一種后進先出的數據結構,LIFO(Last In First Out)
二、棧的應用Undo操作(撤銷)
程序調用所使用的系統棧
三、棧的實現其實,實現一個棧結構非常簡單,我們只需要復用上一節我們自己封裝的數組就可以快速的實現一個棧的創建。1. 首先,我們先創建一個棧的借口,里面聲明我們需要實現的方法:
以數組的最后一個元素當成棧頂元素。
public interface Stack{ boolean isEmpty(); int getSize(); // 移除棧頂元素 E pop(); // 查看棧頂元素 E peek(); // 壓入棧 void push(E ele); }
注:這里我們有一個peek方法,就是查看棧頂元素,所以我們需要給我們自己封裝的數組類添加一個查看最后一個元素的方法:
// 獲取最后一個元素 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即是我們在上一節自己封裝的數組類,不知道的同學可以去查看:
我理解的數據結構(一)—— 不要小看了數組
因為我在ArrayNew中已經實現了動態數組,所以不用考慮棧長度的問題,這樣我們就自己封裝了一個棧(注釋在Stack接口中和ArrayNew類中足夠詳細)。四、用棧去解決《有效的括號》
這是一道leetcode上,編號為20的題目,具體題目描述如下:
給定一個只包括 "(",")","{","}","[","]" 的字符串,判斷字符串是否有效。 有效字符串需滿足: 1.左括號必須用相同類型的右括號閉合。 2.左括號必須以正確的順序閉合。 注意空字符串可被認為是有效字符串。
解題思路
首先,我們可以把左括號直接壓入棧,不論是小括號、中括號還是大括號。
如果拿到的是右括號,則需要做匹配判斷。
拿出棧頂元素,如果與之右括號匹配,則pop出棧頂元素。
拿出棧頂元素,如果與之右括號不匹配,則返回false。
如果字符串比較完成,沒有返回false,則判斷棧是否為空。
為空,返回true,括號匹配成功
不為空,返回false
解題代碼如下:public boolean isValid(String s) { ArrayStack五、棧的復雜度分析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(); }
方法 | 復雜度 |
---|---|
push | O(1) 均攤 |
pop | O(1) 均攤 |
peek | O(1) |
getSize | O(1) |
isEmpty | O(1) |
因為棧的時間復雜度都是O(1),所以棧的性能是很高的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76793.html
摘要:以數組的最后一個元素當成棧頂元素。解題思路首先,我們可以把左括號直接壓入棧,不論是小括號中括號還是大括號。拿出棧頂元素,如果與之右括號不匹配,則返回。如果字符串比較完成,沒有返回,則判斷棧是否為空。 我理解的數據結構(二)—— 棧(Stack) 一、棧基礎 棧是一種線性結構 相比較數組,棧對應的操作是數組的子集 只能從一端添加元素,也只能從同一端取出元素,這一端稱為棧頂 棧是一種后...
摘要:一前言上一篇已經講過了鏈表實現單向鏈表了,它跟數組都是線性結構的基礎,本文主要講解線性結構的應用棧和隊列如果寫錯的地方希望大家能夠多多體諒并指正哦,如果有更好的理解的方式也希望能夠在評論下留言,讓大家學習學習二數據結構棧就是這么簡單數據結構 一、前言 上一篇已經講過了鏈表【Java實現單向鏈表】了,它跟數組都是線性結構的基礎,本文主要講解線性結構的應用:棧和隊列 如果寫錯的地方希望大家...
摘要:一實現一個棧類基于堆棧的特性,可以用數組做線性表進行存儲。出棧出棧同樣是利用數組的方法,在數組尾部推出數據。聚合最后,將所有功能聚合后,如下所示,一個堆棧的數據結構就搞定了。堆棧的經典算法應用,首推就是漢諾塔。 棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。 一、實現一個棧類Stack 基于堆...
閱讀 1752·2021-10-13 09:39
閱讀 1321·2019-08-30 13:58
閱讀 1415·2019-08-29 16:42
閱讀 3563·2019-08-29 15:41
閱讀 2996·2019-08-29 15:11
閱讀 2482·2019-08-29 14:10
閱讀 3413·2019-08-29 13:29
閱讀 2093·2019-08-26 13:27