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());
}
};