有效的括号
栈的经典应用:消除
- 不匹配情形
- 左括号多了
- 右括号多了
- 左右括号类型不匹配
- 匹配情形:字符串遍历结束,同时栈是空的
#define MAX_SIZE 10000
typedef struct{
char stack[MAX_SIZE];
int stackTop;
}MyStack;
bool isValid(char* s) {
MyStack myStack;
myStack.stackTop = -1;
int i;
for (i = 0; s[i] != '\0'; i++){
if (s[i] == '('){
myStack.stack[++myStack.stackTop] = ')';
}
else if (s[i] == '['){
myStack.stack[++myStack.stackTop] = ']';
}
else if (s[i] == '{'){
myStack.stack[++myStack.stackTop] = '}';
}
else if (myStack.stackTop > -1 && myStack.stack[myStack.stackTop] == s[i]){
myStack.stackTop--;
}
else {
break;
}
}
return myStack.stackTop == -1 && s[i] == '\0';
}
删除字符串中的所有相邻重复项
栈的经典应用:消除
char* removeDuplicates(char* s) {
int strLenth = strlen(s);
char *stack = malloc(sizeof(char) * (strLenth + 1));
int stackTop = 0;
int i = 0;
for (; s[i] != '\0'; i++){
if (stackTop > 0 > 0 && stack[stackTop-1] == s[i]){
stackTop--;
}
else {
stack[stackTop++] = s[i];
}
}
stack[stackTop] = '\0';
return stack;
}
逆波兰表达式求值
int evalRPN(char** tokens, int tokensSize) {
int stack[tokensSize];
int index = -1;
int i = 0;
char str1[]="+";
char str2[]="-";
char str3[]="*";
char str4[]="/";
for (; i < tokensSize; i++){
if (strcmp(tokens[i], str1) == 0){
int nums1 = stack[index--];
int nums2 = stack[index--];
stack[++index] = nums1 + nums2;
}
else if (strcmp(tokens[i], str2) == 0){
int nums1 = stack[index--];
int nums2 = stack[index--];
stack[++index] = nums2 - nums1;
}
else if (strcmp(tokens[i], str3) == 0){
int nums1 = stack[index--];
int nums2 = stack[index--];
stack[++index] = nums1 * nums2;
}
else if (strcmp(tokens[i], str4) == 0){
int nums1 = stack[index--];
int nums2 = stack[index--];
stack[++index] = nums2 / nums1;
}
else {
stack[++index] = atoi(tokens[i]);
}
}
return stack[0];
}
- 字符串转化成数字
atoi()
char~~ != char~ [] != char[][]