day11 2.25 栈第二天
20. 有效的括号
链接: 20. 有效的括号
思路:主要想到有三种情况:1.多左括号2.多右括号3.括号不匹配
1.第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
2.第二种情况,括号没有多余,但是 括号的类型没有匹配上。
3.第三种情况,字符串里右方向的括号多余了,所以不匹配。
//辅助函数,判断栈顶元素与输入的括号是否为一对。若不是,则返回False
int notMatch(char par, char* stack, int stackTop){
switch(par){
case ']':
return stack[stackTop - 1] != '[';
case ')':
return stack[stackTop - 1] != '(';
case '}':
return stack[stackTop - 1] != '{';
}
return 0;
}
bool isValid(char * s){
int strLen = strlen(s);
//开辟栈空间
char stack[5000];
int stackTop = 0;
//遍历字符串
int i;
for(i = 0;i < strLen;i++){
//取出当前下标所对应字符
char tempChar = s[i];
//若当前字符为左括号,则入栈
if(tempChar == '(' || tempChar =='[' || tempChar == '{')
stack[stackTop++] = tempChar;
//若当前字符为右括号,且栈中无元素或右括号与栈顶元素不符,返回false
else if(stackTop == 0 || notMatch(tempChar,stack,stackTop))
return 0;
//当前字符与栈顶元素为一对括号,将栈顶元素出栈
else
stackTop--;
}
//若栈中有元素,返回False。若没有元素(stackTop为0),返回True
return !stackTop;
}
1047. 删除字符串中的所有相邻重复项
链接: 1047. 删除字符串中的所有相邻重复项
思路:一看到题想到,字符串元素依次入栈,若两次入栈元素相同则都弹出,最后剩余元素就是删除后的。
char * removeDuplicates(char * s){
//求出字符串长度
int strLength = strlen(s);
//开辟栈空间,栈空间长度为字符串长度+1(为了存放字符串结束标志)
char* stack = (char*)malloc(sizeof(char) * strLength +1);
int stackTop = 0;
int index = 0;
//遍历整个字符串
while(index < strLength){
//取出当前index对应字母,之后index+1
char letter = s[index++];
//若栈中有元素,且栈顶字母等于当前字母(两字母相邻)将栈顶元素弹出
if(stackTop > 0 && letter == stack[stackTop - 1])
stackTop--;
//否则将字母入栈
else
stack[stackTop++] = letter;
}
//存放字符串结束标志'\0'
stack[stackTop] = '\0';
//返回栈本身作为字符串
return stack;
}
150. 逆波兰表达式求值
链接: 150. 逆波兰表达式求值
思路:逆波兰表达式相当于是二叉树中的后序遍历。计算机可以利用栈来顺序处理,不需要考虑优先级了。也不用回退了, 所以后缀表达式对计算机来说是非常友好的。
**这里要思考为什么是num2-num1
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
for(int i= 0;i < tokens.size();i++){
if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/"){
int num1 = st.top();
st.pop();
int num2 = st.top();
st.pop();
if(tokens[i] == "+") st.push(num2 + num1);
if(tokens[i] == "-") st.push(num2 - num1);
if(tokens[i] == "*") st.push(num2 * num1);
if(tokens[i] == "/") st.push(num2 / num1);
}else{
st.push(stoi(tokens[i]));
}
}
int result = st.top();//这里需要将char转化为int类型
st.pop();//将栈中最后一个元素弹出
result result;
}
};