c语言实现括号匹配问题

代码解决方案生成成功,但运行不了。


#include
#include
#include
#define Stack_Size 100
#define TRUE 1
#define FALSE 0
typedef char StackElementType;
typedef struct {
    StackElementType elem[Stack_Size];
    int top;
}SeqStack;
//初始化顺序栈
void InitStack(SeqStack* S) {
    //S = (SeqStack*)malloc(sizeof(SeqStack));
    S->top = -1;
}
//判满
int Judge_full(SeqStack S) {
    if (S.top == (Stack_Size - 1)) {
        return 1;
    }
    else {
        return 0;
    }
}
//判空
int Judge_empty(SeqStack S) {
    if (S.top == -1) {
        return 1;
    }
    else {
        return 0;
    }
}
//进栈
int Push(SeqStack* S, StackElementType x) {
    if (S->top == Stack_Size - 1)  return FALSE;
    S->top++;
    S->elem[S->top] = x;
    return TRUE;
}
//出栈
int Pop(SeqStack* S, StackElementType* x) {
    if (S->top == -1) {
        return FALSE;
    }
    else {
        *x = S->elem[S->top];
        S->top--;
        return TRUE;
    }
}
//读栈顶元素
int GetTop(SeqStack S, StackElementType* x) {
    if (S.top == -1) {
        return FALSE;
    }
    else {
        *x = S.elem[S.top];
        return TRUE;
    }
}
//判断
void Judge(int result) {
    if (result == 1) {
        printf("成功!\n");
    }
    else {
        printf("失败!\n");
    }
}
//字符判断
int Match(char a, char b) {
    if (strcmp(&a, &b) == 0) {
        return 1;
    }
    else {
        return 0;
    }
}
void BracketMatch(char* str) {
    SeqStack S;
    int i;
    char ch;
    InitStack(&S);
    for (i = 0; str[i] != '\0'; i++) {
        switch (str[i]) {
            case '(':
            case '[':
            case '{':
                Push(&S, str[i]);
                break;
            case ')':
            case']':
            case'}':
                if (Judge_empty(S)) {
                    printf("\n右括号多余!");
                    return;
                }
                else {
                    GetTop(S, &ch);
                    if (Match(ch, str[i]))
                        Pop(&S, &ch);
                    else {
                        printf("\n对应的左右括号不同类!");
                        return;
                    }
                }
        }
    }
    if (Judge_empty(S)) {
        printf("\n括号匹配!");
    }
    else {
        printf("\n左括号多余!");
    }
}
int main() {
    char str[Stack_Size];
    printf("请输入字符串:");
    scanf_s("%s", &str);
    BracketMatch(str);
    return 0;
}

scanf_s("%s", &str);
->
scanf_s("%s", &str, Stack_Size -1);

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/221871
  • 这篇博客你也可以参考下:C语言:伪随机数问题以及解决方案
  • 除此之外, 这篇博客: C语言编写猜数字游戏及随机数生成方法中的 代码的实现: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #define _CRT_SECURE_NO_WARNINGS  //防止sancf报安全性错误
    #include<time.h>//time()函数头文件
    #include<stdlib.h>//rand(),srand()函数头文件
    #include<stdio.h>//printf(),scanf()函数头文件
    void menu()//进入游戏对菜单的打印
    {
    	printf("***************************\n");
    	printf("******** 1. play **********\n");
    	printf("******** 0. exit **********\n");
    	printf("***************************\n");
    }
    
    
    int main()
    {
    	int input = 0;//定义一个变量input,存放用户输入的值
    	do
    	{		    //函数可以简单理解为对一段代码的封装。
    		menu();//这是菜单的打印,利用函数可以避免主函数过于冗长
    		printf("请选择(1/0):>");//让用户输入1开始玩游戏,0则退出游戏
    		scanf("%d", &input);
    		switch (input)
    		{
    		case 1:
    			game();//游戏具体实现
    			break;
    		case 0:
    			printf("退出游戏\n");
    			break;
    		default:
    			printf("输入错误\n");
    		}
    	} while (input);//0为假,非0为真,真则会重新进入循环体,假则会退出循环体
    	return 0;
    }
    

    然后就是对游戏具体实现的思考,首先我们要生成一个随机数,现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数,它们就是rand()和srand()函数。

    void game()
    {
    	srand((unsigned int)time(NULL));//为rand()函数重新“播种”,使得rand()产生随机值(rand()产生的随机值我们称为“种子”)发生变化  (具体我们在第二节详细解释)
    	int ret = rand()%100+1;//生成的随机值1-100
    	int guess = 0;
    	while (1)
    	{
    		printf("请猜数字:>");
    		scanf("%d", &guess);
    		if (guess > ret)
    		{
    			printf("猜大了\n");
    		}
    		else if (guess < ret)
    		{
    			printf("猜小了\n");
    		}
    		else
    		{
    			printf("猜对了\n");
    			break;
    		}
    	}
    }
    

    但实际上我们不太喜欢将rand()和srand()函数放得太近,因为这样子反复运行程序还是容易使得rand()函数产生相近的值,所以我们比较提倡将srand()函数放到主函数中,事实上每次用到rand()函数只需要srand()函数“播种”一次即可。接下来展示就是猜数字游戏所示全部代码:

    #define _CRT_SECURE_NO_WARNINGS  //防止sancf报安全性错误
    #include<time.h>//time()函数头文件
    #include<stdlib.h>//rand(),srand()函数头文件
    #include<stdio.h>//printf(),scanf()函数头文件
    void game()
    {
    	int ret = rand()%100+1;//生成的随机值1-100
    	int guess = 0;
    	while (1)
    	{
    		printf("请猜数字:>");
    		scanf("%d", &guess);
    		if (guess > ret)
    		{
    			printf("猜大了\n");
    		}
    		else if (guess < ret)
    		{
    			printf("猜小了\n");
    		}
    		else
    		{
    			printf("猜对了\n");
    			break;
    		}
    	}
    }
    void menu()//进入游戏对菜单的打印
    {
    	printf("***************************\n");
    	printf("******** 1. play **********\n");
    	printf("******** 0. exit **********\n");
    	printf("***************************\n");
    }
    
    int main()
    {
    	int input = 0;//定义一个变量input,存放用户输入的值
    	srand((unsigned int)time(NULL));//为rand()函数重新“播种”,使得rand()产生随机值(rand()产生的随机值我们称为“种子”)发生变化  (具体我们在第二节详细解释)
    	do
    	{		    //函数可以简单理解为对一段代码的封装。
    		menu();//这是菜单的打印,利用函数可以避免主函数过于冗长
    		printf("请选择(1/0):>");//让用户输入1开始玩游戏,0则退出游戏
    		scanf("%d", &input);
    		switch (input)
    		{
    		case 1:
    			game();//游戏具体实现
    			break;
    		case 0:
    			printf("退出游戏\n");
    			break;
    		default:
    			printf("输入错误\n");
    		}
    	} while (input);//0为假,非0为真,真则会重新进入循环体,假则会退出循环体
    	return 0;
    }
    

    代码运行截图:
    在这里插入图片描述


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^