数据结构刷题-栈

20

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false
示例 4:

输入:s = "([)]"
输出:false
示例 5:

输入:s = "{[]}"
输出:true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses

自解

#include "string.h"

bool isValid(char * s){
    char* stact = (char*)malloc(sizeof(char) * strlen(s));
    int i =0;
    int j =-1;
    while(s[i] != '\0')
    {
        if(j == -1)
        {
            j++;
            stact[j] = s[i];
            
        }
        else
        {
            if(s[i] - stact[j] == 1 || s[i] - stact[j] == 2)
            {
                j--;
            }
            else
            {
                j++;
                stact[j] = s[i];
            }
        }
        i++;
    }
    if(j == -1)
    {
        return true;
    }
    return false;

}

总结

         官方解看了下,用了什么哈希表,没学到,先不管了,说说自己的结题思路吧。其实就是一个栈的入栈与出栈,只是自己没做过栈相关的题,第一次看到有点陌生罢了,甚至不记得栈的定义了。用数组实现栈时,一般栈顶在-1处,表示栈为空,来一个元素,栈顶加一并且赋值。出栈就栈顶减1就完事了,没什么好说的。重点说下遇到的一个BUG吧,char* stact = (char*)malloc(sizeof(char) * strlen(s));在申请内存的时候出现了一个BUG,申请的长度我开始写的是sizeof(*s),好像不对,具体原因不知道,以后就申请单个元素大小乘以元素个数吧。

        写着写着发现个事,自己没有free,这个习惯好坏啊,以后一定得改,谁申请谁释放啊!!!

150

根据 逆波兰表示法,求表达式的值。

有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

注意 两个整数之间的除法只保留整数部分。

可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 1:

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation

自解 

int evalRPN(char ** tokens, int tokensSize){
    int* stack = (int*)malloc(sizeof(int) * tokensSize);
    int resutl = 0;
    int j =-1;
    for(int i = 0; i < tokensSize;i++)
    {
        if(tokens[i][0] == '+')
        {
            stack[j-1] = stack[j] + stack[j-1];
            j--;
        }
        else if((tokens[i][0] == '-') && (tokens[i][1] == '\0'))
        {
            stack[j-1] = stack[j-1] - stack[j];
            j--;
        }
        else if(tokens[i][0] == '*')
        {
            stack[j-1] = stack[j] * stack[j-1];
            j--;
        }
        else if(tokens[i][0] == '/')
        {
            stack[j-1] = stack[j-1] / stack[j];
            j--;
        }
        else
        {
            j++;
            stack[j] = atoi(tokens[i]);
        }
    }
    resutl = stack[0];
    free(stack);
    stack = NULL;
    return resutl;
}

 官方解

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];
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/solution/ni-bo-lan-biao-da-shi-qiu-zhi-by-leetcod-wue9/
来源:力扣(LeetCode)

总结

         这个题目看着不难,而且以前做过类似的一个题目,大致的流程是相当的清楚的。但是,今天做这个题目的时候,整个过程漏洞百出:其一,进行计算的时候,出入栈的顺序没留一个心眼,减法和除法运算是有顺序的啊喂!!其二,没有考虑“-”的特殊情况,我开始是采用的判断每个字符串第一个字符来判断执行的操作,这个时候,有个必然的巧合没注意到,减法运算和负数,这两个没有进行区分,所以在这之间一直报栈溢出的错误。并且由这个判断方式啊,引出了一个很有趣的东西,运算优先级和运算顺序的问题,具体见大佬的博客:C/C++逻辑运算符 | | 和 && 的优先级误区——优先级决定运算顺序吗?_Italink的博客-CSDN博客_c++逻辑运算符 优先级

         而我这个判断的问题是,&&和==问题,说的是一个表达式不能有多个bool,具体原因不太清楚了,但是在等式上面加括号就完美解决了,遇事不急加括号。具体见这个博主:error:lvalue required as left operand of assignment_叫毛哥的博客-CSDN博客

         官方解和我的思路差不多,就不多说了。

        

猜你喜欢

转载自blog.csdn.net/MLuhuihui/article/details/123670596