1. 力扣20 : 有效的符號
(1). 題
給定一個只包括?'('
,')'
,'{'
,'}'
,'['
,']'
?的字符串?s
?,判斷字符串是否有效。
有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
- 每個右括號都有一個對應的相同類型的左括號。
示例 1:
輸入:s = "()" 輸出:true
示例?2:
輸入:s = "()[]{}" 輸出:true
示例?3:
輸入:s = "(]" 輸出:false
提示:
1 <= s.length <= 104
s
?僅由括號?'()[]{}'
?組成
(2). 思路
自己設計了一個棧類. 首先判斷該字符串是否是空字符串,如果不是空字符串,那么將棧的棧頂元素與字符串此時需要比較的字符值進行匹配,如果成功匹配,則將該棧頂元素移除pop,如果不匹配,那么將該字符值push到棧.
判斷該字符串是否是有效的,只需判斷棧是否為空即可.
(3). 解
class Solution {public boolean isValid(String s) {//如果是空字符串if(s.length() == 0) {return true;}EnStack stack = new EnStack(s.length());int i = 0;while(i < s.length()) {if(stack.peek() == '(' && s.charAt(i) == ')') {stack.pop();} else if (stack.peek() == '{' && s.charAt(i) == '}') {stack.pop();} else if(stack.peek() == '[' && s.charAt(i) == ']') {stack.pop();} else {stack.push(s.charAt(i));}i++;}return stack.isEmpty();}
}
class EnStack{//棧頂指針private int top;private char[] stack;public EnStack(int capacity) {stack = new char[capacity];}public void push(char value) {if(isFull()) {return;}stack[top++] = value;}public void pop() {if (isEmpty()) {return;}--top;}public char peek() {if(isEmpty()) {//只要返回的不是'{','[','('其中之一的字符就行return 'a';}return stack[top - 1];}public boolean isFull() {return top == stack.length;}public boolean isEmpty() {return top == 0;}
}
2. 力扣150 : 逆波蘭表達式求值
(1). 題 :?
給你一個字符串數組?tokens
?,表示一個根據?逆波蘭表示法?表示的算術表達式。
請你計算該表達式。返回一個表示表達式值的整數。
注意:
- 有效的算符為?
'+'
、'-'
、'*'
?和?'/'
?。 - 每個操作數(運算對象)都可以是一個整數或者另一個表達式。
- 兩個整數之間的除法總是?向零截斷?。
- 表達式中不含除零運算。
- 輸入是一個根據逆波蘭表示法表示的算術表達式。
- 答案及所有中間計算結果可以用?32 位?整數表示。
示例?1:
輸入:tokens = ["2","1","+","3","*"] 輸出:9 解釋:該算式轉化為常見的中綴算術表達式為:((2 + 1) * 3) = 9
示例?2:
輸入:tokens = ["4","13","5","/","+"] 輸出:6 解釋:該算式轉化為常見的中綴算術表達式為:(4 + (13 / 5)) = 6
示例?3:
輸入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"] 輸出:22 解釋:該算式轉化為常見的中綴算術表達式為:((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = ((10 * (6 / (12 * -11))) + 17) + 5 = ((10 * (6 / -132)) + 17) + 5 = ((10 * 0) + 17) + 5 = (0 + 17) + 5 = 17 + 5 = 22
提示:
1 <= tokens.length <= 104
tokens[i]
?是一個算符("+"
、"-"
、"*"
?或?"/"
),或是在范圍?[-200, 200]
?內的一個整數
逆波蘭表達式:
逆波蘭表達式是一種后綴表達式,所謂后綴就是指算符寫在后面。
- 平常使用的算式則是一種中綴表達式,如?
( 1 + 2 ) * ( 3 + 4 )
?。 - 該算式的逆波蘭表達式寫法為?
( ( 1 2 + ) ( 3 4 + ) * )
?。
逆波蘭表達式主要有以下兩個優點:
- 去掉括號后表達式無歧義,上式即便寫成?
1 2 + 3 4 + *
也可以依據次序計算出正確結果。 - 適合用棧操作運算:遇到數字則入棧;遇到算符則取出棧頂兩個數字進行計算,并將結果壓入棧中