1,判断给出的string中,括号是不是一一对应的,比如 ( ) 或者 { } [ ] ( )算合法的括号,(] 或者 ( [ ) ] 都不合法。
用一个Stack来存储括号, 主要考察对栈数据结构的操作。
算法的时间复杂度是O(n),空间复杂度也是O(n)。
遍历传入的String s,如果遇到左括号就入栈;如果遇到右括号,检查栈如果为空,证明不能匹配,如果栈不空,pop出栈顶的元素,看是否与当前的右括号匹配。
如果匹配,继续向下进行新一轮的循环,如果不匹配,返回false.
bool isValid(string const& s)
{
string left = "({[";
string right = ")}]";
stack<char> stk;
for (auto c : s)
{
if (left.find(c) != string::npos)
stk.push(c);
else
{
if (stk.empty() || stk.top() != left[right.find(c)])
return false;
else
stk.pop();
}
}
return stk.empty();
}
2,给定一个字符串s,由 ‘(’ 和 ‘)’ 组成,求最长合法括号(valid parentheses)长度
int LongestValidParenttheses(string s)
{
int max_len = 0, last = -1;//the position of the last ')'
stack<int> lefts;
for (int i = 0; i < s.size(); ++i)
{
if (s[i] == '(')
{
lefts.push(i);
}
else
{
if (lefts.empty())
{
//no matching left
last = i;
}
else
{
//find a matching pair
lefts.pop();
if (lefts.empty())
{
max_len = max(max_len, i - last);
}
else
{
max_len = max(max_len, i - lefts.top());
}
}
}
return max_len;
}
大概过程如下:
3,计算直方图中最大的矩形
https://www.cnblogs.com/love-yh/p/7182920.html这篇博客讲的非常详细~~~~
4计算逆波兰表达式
逆波兰表达式就是把操作数放前面,把操作符后置的一种写法。
从前往后遍历数组,遇到数字则压入栈中,遇到符号,则把栈顶的两个数字拿出来运算,把结果再压入栈中,直到遍历完整个数组,栈顶数字即为最终答案。
int evalIRPN(vector<string>& token)
{
if(token.size() == 1)
return stoi(token.c_str());
stack<int> s;
for(int i = 0;i<token.size();++i)
{
if(token[i] != "+" && token[i] != "-" && token[i] != "*" && token[i] != "/")
{
s.push(atoi(token[i].c_str());
}
else
{
int m = s.top();
s.pop();
int n = s.top();
s.pop();
if(token[i] == "+")
s.push(n+m);
if(token[i] == "-")
s.push(n-m);
if(token[i] == "*")
s.push(n*m);
if( token[i]== "/")
s.push_back((n/m);
}
}
return s.top();
}