棧:
棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱爲棧頂,相對地,把另一端稱爲棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成爲新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成爲新的棧頂元素。
百度百科的解釋。
第一次接觸的人肯定會看得頭大。我用大白話來解釋一下棧。
就跟手槍壓子彈,發射子彈一樣。
如上圖,子彈只能從彈夾上邊一次壓進去,同時也只能從彈夾上邊出來。最先進去的子彈,被壓在最底下。最後進去的子彈,在最上邊。射出時,最上邊(最後進去的)的先出去,最下邊的(最先進去的)後出來。
類似這種操作,放到計算機上,就是棧。
對一個數組,操作時,放元素,只放在最後,取元素,只取最後一個。就是棧。(運算受限的線性表)
棧的用處:
用電腦寫文檔或者文字的時候,就是把文字壓到棧裏邊(入棧),然後可以進行撤銷操作,(出棧)
Java棧:
聲明:
Stack<type> stack = new Stack<>();
方法摘要:
方法摘要 | |
---|---|
boolean |
empty() 測試堆棧是否爲空。 |
E |
peek() 查看堆棧頂部的對象,但不從堆棧中移除它。 |
E |
pop() 移除堆棧頂部的對象,並作爲此函數的值返回該對象。 |
E |
push(E item) 把項壓入堆棧頂部。 |
int |
search(Object o) 返回對象在堆棧中的位置,以 1 爲基數。 |
例題:
力扣-題號-20-https://leetcode-cn.com/problems/valid-parentheses/
20. 有效的括號
給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
示例 4:
輸入: "([)]"
輸出: false
示例 5:
輸入: "{[]}"
輸出: true
class Solution {
public boolean isValid(String s) {
Stack<Character> st = new Stack<>();
char c ;
char a;
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
if (c == '(' || c == '[' || c == '{') st.push(c);
else {
if (st.isEmpty()) return false;
a = st.pop();
if((c == ')' && a != '(') ||(c == ']' && a != '[') ||(c == '}' && a != '{')) return false;
}
}
return st.isEmpty();
}
}