c语言判断有效括号序列


bool isValid(char * s){
int k=-1;
int len=strlen(s);
char stack[10000];
for(int i=0;i<len;i++)
{
    if(s[i]=='('||s[i]=='{'||s[i]=='[')
    stack[++k]=s[i];
    else   
    {
        switch(s[i])
        {
            case ')':if(s[k]=='(')
                    k--;break;
             case ']':if(s[k]=='[')
                    k--;break;
             case '}':if(s[k]=='{')
                    k--;break;
        }
        
    }
}
if(k==-1)
return true;
return false;
}

判断有效括号序列,为什么输入()[]时错了

if(s[k]=='(')
这里应该是
if(stack[k]=='(')
下面类似

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7629431
  • 这篇博客也不错, 你可以看下利用堆栈解决括号匹配问题 [C语言][括号序列][有效的括号][堆栈]
  • 除此之外, 这篇博客: c语言操作符详解中的 九.下标访问,函数调用,结构体成员访问操作符 [] () . -> 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 下标访问操作符在c语言中只用于数组,但是由于指针和数组有极多的相似之处,指针在c语言中也可以通过下标访问。举例:

    int main()
    {
    	int arr[5] = { 1, 5, 7, 8, 9 };
    	int *p = arr;
    	printf("%d %d\n", arr[2], 3[arr]);
    	printf("%d %d\n", p[2], 3[p]);
    	return 0;
    }
    

    运行结果:
    在这里插入图片描述
    可看到 []对数据位置的控制并不严格,数组名(或指针名)可以和下标调换位置,但是我们平时还是把数字放在[]内,规范自己的代码!
    注:《C专家编程》一书中,作者明确指出[ ]运算符作用于指针和数组名时,行为是不一样的。数组名与指针不同。想了解指针和数组的详细关系可以参看这本书。
    函数调用运算符 函数名(传入实参)
    函数调用操作符可以接受任意多个参数,第一个参数就是函数名,其余参数就是传递给函数的参数,并由调用函数来决定其余参数的类型和个数。
    访问结构体成员操作符 . ->
    结构体成员的变量可通过 . 访问结构体成员。
    使用方fa:变量名.结构体成员名
    结构体指针可以通过 -> 指向结构体成员
    使用方法:结构体指针->结构体成员
    举例:

    struct Student
    {
    	int num;
    	char name[20];
    	char sex[4];
    	int age;
    };
    int main()
    {
    	struct Student student = { 124, "张三", "男", 23 };
    	struct Student* p = &student;
    	printf("%d %s %s %d\n", student.num, student.name, p->sex, p->age);
    	return 0;
    }
    

    运行结果:
    在这里插入图片描述
    到这里,c语言操作符基本就给大家罗列完了,但是看完这些操作符你并不一定能正确使用它们,因为在使用过程中你还不能完全掌握它们的优先级和结合性
    两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
    那么问题出现了,优先级那么多,我需要都背下来吗?能背下来当然更好喽,不过记不下来也没关系,在使用中加上括号就行了,不管它哪个优先级高,都得按照我的逻辑来,这样就简单多了。