LeetCode 20. 有效的括號
給定一個只包括 '(',')','{','}','[',']'的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: "([)]"
輸出: false
示例 2:
輸入: "{[]}"
輸出: true
思路
將左括號推入棧中,當遇到右括號時,查看是否與棧頂元素匹配,不匹配返回false,匹配將棧頂元素出棧。
注意:匹配時要注意判斷棧中是否還有元素
操作完全部括號後,棧中沒有元素,則說明匹配成功。
代碼
class Solution {
public:
bool isValid(string s) {
stack<char> stack;
if(s.size()==0) return true;
stack.push(s[0]);
for(int i=1; i<s.size(); i++)
{
//分兩種情況討論
//1.右括號,看下是否匹配
//2.左括號,將其入棧
if(s[i]==')' || s[i]=='}'|| s[i]==']')
{
if(stack.size()==0) return false; //"[])"
char top = stack.top();
char match;
if(s[i]==')') match='(';
else if(s[i]=='}') match='{';
else match='[';
if(match != top) return false;
stack.pop();
}else
stack.push(s[i]);
}
if(stack.size()==0) return true;
return false;
}
};
LeetCode 150. 逆波蘭表達式求值
根據逆波蘭表示法,求表達式的值。
有效的運算符包括 +, -, *, / 。每個運算對象可以是整數,也可以是另一個逆波蘭表達式。
說明:
整數除法只保留整數部分。
給定逆波蘭表達式總是有效的。換句話說,表達式總會得出有效數值且不存在除數爲 0 的情況。
示例 1:
輸入: ["2", "1", "+", "3", "*"]
輸出: 9
解釋: ((2 + 1) * 3) = 9
示例 2:
輸入: ["4", "13", "5", "/", "+"]
輸出: 6
解釋: (4 + (13 / 5)) = 6
思路
使用棧模擬計算過程
遍歷整個數則,當遇到符號的時候,從棧中取出兩個元素進行運算,並且將計算後的結果推入棧中
代碼
class Solution {
public:
int strToInt(string s)
{
int begin = 0;
if(s[0]=='-') begin=1;
int sum = 0;
for(int i=begin; i<s.size(); i++)
{
sum = sum*10 + s[i]-'0';
}
if(begin==1) return -1*sum;
return sum;
}
string intToStr(int d)
{
bool flag = false;//判斷是否爲負數
if(d<0)
{
flag=true;
d=-1*d;
}
if(d==0) return "0";
string s="";
while(d!=0)
{
char c = d%10+'0';
s=c+s;
d=d/10;
}
if(flag) s="-"+s;
return s;
}
int evalRPN( vector<string>& tokens) {
//使用棧模擬,將數字放入棧中
//當遇到符號時,從棧頭彈出兩個元素進行操作,將結果入棧
int n = tokens.size();
if(n==0) return 0;
stack<string> stack;
for(int i=0; i<tokens.size(); i++)
{
if(tokens[i]=="+" || tokens[i]=="-" || tokens[i]=="*"|| tokens[i]=="/")
{
int last = strToInt(stack.top());
stack.pop();
int pre = strToInt(stack.top());
stack.pop();
int res = 0;
if(tokens[i]=="+")
res = pre+last;
else if(tokens[i]=="-")
res = pre-last;
else if(tokens[i]=="*")
res = pre*last;
else
res = pre/last;
stack.push(intToStr(res));
}else
{
stack.push(tokens[i]);
}
}
return strToInt(stack.top());
}
};