题目链接:20. 有效的括号
这道题有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,字符串遍历完之后,栈是空的,就说明全都匹配了。
代码如下:
class Solution {
public:
bool isValid(string s) {
stack<int> st;
if(st.size()%2!=0)
return false;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(') st.push(')');
else if(s[i]=='[') st.push(']');
else if(s[i]=='{') st.push('}');
else if(st.empty()||s[i]!=st.top())
return false;
else
st.pop();
}
return st.empty();
}
};
题目链接:1047. 删除字符串中的所有相邻重复
(1)使用双指针法:
char * removeDuplicates(char * s){
int fast=0,slow=0;
int len=strlen(s);
while(fast<len)
{
char letter=s[slow]=s[fast++];
if(slow>0&&letter==s[slow-1])
slow--;
else
slow++;
}
s[slow]=0;
return s;
}
(2)使用栈
char * removeDuplicates(char * s){
int len=strlen(s);
char* stack=(char*)malloc(sizeof(char)*len+1);
int stackTop=0;
int index=0;
while(index<len)
{
char letter=s[index++];
if(stackTop >0 && letter==stack[stackTop-1])
stackTop--;
else
stack[stackTop++]=letter;
}
stack[stackTop]='\0';
return stack;
}
题目链接:150. 逆波兰表达式求值
这道题只要知道逆波兰表达式是用后序遍历的方式把二叉树序列化了,就可以了。
在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这就是一个相邻字符串消除的过程。
代码如下:
class Solution {
public:
int evalRPN(vector<string>& s) {
stack<int> st;
for(int i=0;i<s.size();i++)
{
if(s[i]=="+"||s[i]=="-"||s[i]=="*"||s[i]=="/")
{
int num1=st.top();
st.pop();
int num2=st.top();
st.pop();
if(s[i]=="+")
st.push(num2+num1);
if(s[i]=="-")
st.push(num2-num1);
if(s[i]=="*")
st.push(num2*num1);
if(s[i]=="/")
st.push(num2/num1);
}
else
st.push(stoi(s[i]));
}
return st.top();
}
};