① 删除最外层的括号
题目如下;
下面展示 代码
。
// 栈
string removeOuterParentheses(string S)
{
stack<char> s;
string s1;
int left,right;
for(int i=0;i<S.length();i++)
{
if(S[i] == '(')
{
if(s.empty())
left = i;
s.push('('); //压入栈
}
else if(S[i] == ')')
{
s.pop();
if(s.empty())
{
right = i;
}
}
if(s.empty())
s1 += S.substr(left+1,right-left-1); //栈空一次就提取一次字符串
}
return s1;
}
// 直接快速的解法(一般人估计想不到)
string removeOuterParentheses(string S)
{
string s1;
int left = 1,right = 0;
for(int i = 1;i<S.length();i++)
{
if(S[i] == '(') left++;
else right++;
if(left == right)
{
left = 1;
right = 0;
i++;
}
else s1.push_back(S[i]) ;
}
return s1;
}
②比较含退格的字符串
下面展示 代码
。
//自己的解法,利用栈可一个个压入和弹出来解决,时间上100,空间略差。
bool backspaceCompare(string S, string T)
{
stack<char> s1;
stack<char> s2;
for(int i=0;i<S.length();i++)
{
if(S[i] >= 'a' && S[i]<= 'z')
s1.push(S[i]);
else {
if(!s1.empty()) s1.pop();
}
}
for(int i=0;i<T.length();i++)
{
if(T[i] >= 'a' && T[i]<= 'z')
s2.push(T[i]);
else {
if(!s2.empty()) s2.pop();
}
}
int j = s1.size();
int k = s2.size();
if(j != k ) return false;
for(int i=0;i<j;i++)
{
if(s1.top() != s2.top())
{
return false;
}
else {
s1.pop();
s2.pop();
}
}
return true;
}
// 双指针解法,双100
var foo = 'bar';
③最小栈问题
下面展示 代码
。
// 本解法的思路是,利用一个辅助栈来储存该栈中的最小值,最后返回最小值
class MinStack {
public:
/** initialize your data structure here. */
stack<int> s1;
stack<int> s2;
MinStack()
{
while(!s1.empty()) s1.pop();
while(!s2.empty()) s2.pop();
s2.push(INT_MAX);
}
void push(int x)
{
s1.push(x);
if(x<s2.top()) s2.push(x);
else s2.push(s2.top());
}
void pop()
{
s1.pop();
s2.pop();
}
int top()
{
return s1.top();
}
int getMin()
{
return s2.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
④每日温度(递减栈问题)
本题有两种解法:
第一种:暴力法,两个循环就可以解决大部分问题,但是我写的代码一直提示超时(这让我有点无从下手,重新寻找另解)
第二种:递减栈,利用一个循环将所有的温度按照递减的序列入栈,top元素始终最小,如果下一个元素比栈顶元素大,栈顶元素就找到了答案,直接出栈,继续和下一个top元素比较,直到小于栈顶元素,然后顺势入栈。
下面展示 代码
。
//
vector<int> dailyTemperatures(vector<int>& T)
{
stack<int> s;
int n=T.size();
vector<int> T1(n,0); // 该行需要设置大小,不然无法直接return
for(int i=0;i<n;i++)
{
if(s.empty())
{
s.push(i);
continue;
}
while(!s.empty() && T[i]>T[s.top()])
{
T1[s.top()] = i-s.top();
s.pop();
}
s.push(i);
}
return T1;
}
⑤逆波兰表达式求值
由题意,我们很容易能够想到,利用栈来解决问题,遍历整个vector,如果是数字,利用stringstream进行字符串与数字的转换,如果是运算符号,则弹出栈中的前两个数字进行运算,然后将结果再次入栈。这样依次计算,最后返回栈顶的元素就能得到结果。
下面展示 代码
。
// 栈
int evalRPN(vector<string>& tokens)
{
stack<int> s;
stringstream ss;
for(int i=0;i<tokens.size();i++)
{
string c = tokens[i];
if(c == "+"||c == "-"||c == "*"||c == "/" )
{
int temp1 = s.top(); s.pop();
int temp2 = s.top(); s.pop();
int temp3 = 0;
if(c == "+") {temp3 = temp1+temp2; s.push(temp3);}
else if(c == "-") {temp3 = temp2-temp1; s.push(temp3);}
else if(c == "*") {temp3 = temp1*temp2; s.push(temp3);}
else{temp3 = temp2/temp1; s.push(temp3);}
}
else
{
int number;
ss.clear();
ss<<c;
ss>>number;
s.push(number);
}
}
return s.top();
}