创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。
一、有效的括号
思路:参考carl的文档和代码进行理解
ledcode题目:https://leetcode.cn/problems/valid-parentheses/description/
AC代码:
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;
}
二、删除字符串中的所有相邻重复项
思路:通过快慢指针的方法,来进行数组元素的比对和shanchu
lecode题目:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/
AC代码:
char* removeDuplicates(char* s) {
int fast = 0;
int slow = 0;
int strLength = strlen(s);
while(fast < strLength){
char letter = s[slow] =s[fast++];
if(slow > 0 && letter == s[slow - 1])
slow--;
else
slow++;
}
s[slow] = 0;
return s;
}
三、逆波兰表达式求值
思路:参考了该题ledcode的题解
ledcode题目:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/
AC代码:
bool isNumber(char* token) {
return strlen(token) > 1 || ('0' <= token[0] && token[0] <= '9');
}
int evalRPN(char** tokens, int tokensSize) {
int n = tokensSize;
int stk[n], top = 0;
for (int i = 0; i < n; i++) {
char* token = tokens[i];
if (isNumber(token)) {
stk[top++] = atoi(token);
} else {
int num2 = stk[--top];
int num1 = stk[--top];
switch (token[0]) {
case '+':
stk[top++] = num1 + num2;
break;
case '-':
stk[top++] = num1 - num2;
break;
case '*':
stk[top++] = num1 * num2;
break;
case '/':
stk[top++] = num1 / num2;
break;
}
}
}
return stk[top - 1];
}
全篇后记:
AC不了看题解,虽然觉得很多题目做完就忘,但收获还是很大,坚持下去就会更好。