算法刷题 day11

20. 有效的括号

//总共只有三种不匹配的情况:
//字符串扫描完 ,栈内仍剩余一个括号
//括号不匹配
//字符串扫描到一个右括号但栈已空
//遇到一个左括号则将相应类型的一个右括号压栈(方便后续匹配)

bool isValid(char* s) {
    int my_stack[10000]={'\0'};
    int top=0;   
    
    if(strlen(s)%2!=0) return false;//剪枝(第一种情况)

    for(int j=0;j

1047. 删除字符串中的所有相邻重复项

//用一个栈,类似括号匹配过程
char* removeDuplicates(char* s) {

    int my_stack[200000] = {'\0'};
    int top = 0;
    //printf(" strlen=%d  ", strlen(s));

    for (int i = 0; i < strlen(s); i++) {//进行匹配
        // printf(" strlen=%d i=%d top=%d ",strlen(s),i,top);
        if (top == 0 || my_stack[top - 1] != s[i])//栈为空或与栈顶元素不匹配则直接入栈
            my_stack[top++] = s[i];
        else {//与栈顶元素匹配则直接进行弹栈(不用压栈)
            top--;
        }
    }
    //printf(" strlen=%d  ", strlen(s));
    // printf("\n");
    int j = 0;
    while (j < top) {
        s[j] = my_stack[j];//从栈底开始遍历,不然字符串是反的
        j++;
    }

    s[j] = '\0';
    return s;
}

150. 逆波兰表达式求值 

int evalRPN(char** tokens, int tokensSize) {
    int my_stack[15000]={0};
    int top=0;
     //printf("tokensSize=%d\n",tokensSize);
    for(int i=0;i

你可能感兴趣的:(算法,c++,java,c语言)