第一题:有效的括号
1.首先理清楚不匹配有哪些情况:
情况0:如果字符串的长度为奇数,肯定不匹配
情况1:字符串里左方向的括号多余了,所以不匹配
情况2:括号里没有多余,但是括号的类型不匹配
情况3:字符串里右方向的括号多余了,不匹配
2.入栈的内容也不是有啥入啥,而是从左开始,第一个元素是(,入栈的内容就是),然后到了右方向的时候弹出);
3.思路:如果字符串正确的话,肯定是先左方向,然后右方向,所以先根据左方向的情况把相匹配的右方向放进栈里,然后到了右方向如果相同则依次弹出,最后检查是否还有剩余,如果没有说明匹配成功
第二题:删除字符串中所有的相邻重复项
1.如同消消乐,abbaca消除之后就是ca,首先bb消除后就是aaca,然后消除aa,最后只剩ca
2.代码思想:用一个栈依次将字符串中的元素存进去,如果新的元素等于栈顶元素st.top(),也就跟前一个进去的元素相等,就弹出前一个进去的元素
3.最后检查栈是否还有元素,如果有用一个string保存下来,记得栈是先进后出,所以string要反转
利用reverse(s.begin(),s.end())函数反转
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for(char ch:s)
{
if(st.empty()||ch!=st.top())
{
st.push(ch);
}
else
{
st.pop();// ch 与 st.top()相等的情况
}
}
string result="";
while(!st.empty())
{
result+=st.top(); // 将栈中元素放到result字符串汇总
st.pop();
}
reverse(result.begin(),result.end());
return result;
}
};
注意黑色箭头对应的才是st.top()
第三题:逆波兰表达式求值
1.和上一题思路差不多,遇上+-*/就进行一次计算消除,然后把计算结果放进栈里
思路:1、创建一个栈;
2、对字符串每个元素循环
3、如果字符等于+-*/,进入条件语句,将前一个元素存进long long num1中,然后将其弹出,将下一个元素存进long long num2中,再将其弹出
4、对出现的运算符做判断,比如是+,则 将num1+num2的结果Push进栈内
5、不满足条件语句的,依次Push进栈内
6、最后用一个元素将栈内剩下的结果保存出来,返回时用