代码随想录算法训练营第十一天|20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值

20.有效的括号 https://leetcode.cn/problems/valid-parentheses/

bool isValid(char * s){
    int len = 0;
    int num = 0;
    int i = 0;
    char *array = NULL;

    len = strlen(s);
    array = (char *)malloc(len + 1);
    if (NULL == array) return false;
    memset(array, 0, len + 1);

    for (i = 0; i < len; i++)
    {
        switch (s[i])
        {
            case '(':
            case '{':
            case '[':
                array[num++] = s[i];
                break;
            case ')':
                if (num <= 0 || '(' != array[num - 1])
                {
                    if (NULL != array){free(array); array = NULL;}
                    return false;
                }
                num--;
                break;
            case '}':
                if (num <= 0 || '{' != array[num - 1]){
                    if (NULL != array){free(array); array = NULL;}
                    return false;
                }
                num--;
                break;
            case ']':
                if (num <= 0 || '[' != array[num - 1]){
                    if (NULL != array){free(array); array = NULL;}
                    return false;
                }
                num--;
                break;
            default:
                break;
        }   
    }   

END:
    if (NULL != array){free(array); array = NULL;}
    if (0 == num)
        return true;
    return false;
}

 1047.删除字符串中的所有相邻重复项 https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/

char * removeDuplicates(char * s){
    int len = 0;
    char *array = 0;
    int i = 0;
    int num = 0;

    len = strlen(s);
    array = (char *)malloc(len + 1);
    if (NULL == array) return NULL;
    memset(array, 0, len + 1);

    //printf("111\n");
    array[num++] = s[0];
    for (i = 1; i < len; i++)
    {
        //printf("start i = %d\n", i);
        if (num <= 0 || array[num - 1] != s[i])
            array[num++] = s[i];
        else if (num >= 1 && array[num - 1] == s[i])
            num--;
        //printf("end i = %d\n", i);
    }

    //printf("222\n");
    memset(s, 0, len);
    strncpy(s, array, num);
    if (NULL != array){free(array); array = NULL;}
    //printf("333\n");
    return s;
}

150.逆波兰表达式求值 https://leetcode.cn/problems/evaluate-reverse-polish-notation/

#ifdef DEBUG
#define debug(fmt, args...)  do{printf("[%s+%d] "fmt"\n", __FUNCTION__, __LINE__, ##args);}while(0)
#else
#define debug(fmt, args...)
#endif

int evalRPN(char **tokens, int tokensSize){
    int i = 0;
    //int tmp_num = 0;
    long int value = 0;
    int *array = NULL;
    int num = 0;
    long int array1 = 0;
    long int array2 = 0;

    array = (int *)malloc(sizeof(long int) * tokensSize);
    if (NULL == array) return 0;
    memset(array, 0, sizeof(long int) * tokensSize);

    for (i = 0; i < tokensSize; i++)
    {
        // is num
        if (0 == strcmp(tokens[i], "+"))
        {
            array2 = array[--num];
            array1 = array[--num];
            value = array1 + array2;
            debug("%ld + %ld = %ld", array1, array2, value);
            array[num++] = value;
        }
        else if (0 == strcmp(tokens[i], "-"))
        {
            array2 = array[--num];
            array1 = array[--num];
            value = array1 - array2;
            debug("%ld - %ld = %ld", array1, array2, value);
            array[num++] = value;
        }
        else if (0 == strcmp(tokens[i], "*"))
        {
            array2 = array[--num];
            array1 = array[--num];
            value = array1 * array2;
            debug("%ld * %ld = %ld", array1, array2, value);
            array[num++] = value;
        }
        else if (0 == strcmp(tokens[i], "/"))
        {
            array2 = array[--num];
            array1 = array[--num];
            value = array1 / array2;
            debug("%ld / %ld = %ld", array1, array2, value);
            array[num++] = value;
        }
        // is 运算符
        else
        {
            value = atoi(tokens[i]);
            array[num++] = value;
        }
    }

    value = array[--num];
    return value;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值