C语言:用栈来检查括号的匹配
以下代码哪里出错了,如何改正?
#include<stdio.h>
#define max_size 21
typedef struct
{
char data[max_size];
int top;
}stack;
int isleft(char c){
int ret;
switch (c)
{
case '[':
case '{':
ret = 1;
break;
default:
ret = 0;
break;
}
return ret;
}
int isright(char c){
int ret;
switch (c)
{
case ']':
case '}':
ret = 1;
break;
default:
ret = 0;
break;
}
return ret;
}
int check(char left,char right){
int ret = 0;
switch (left)
{
case '[':
if (right == ']')
{
ret = 1;
}
break;
case '{':
if (right == '}')
{
ret = 1;
}
break;
default:
ret = 0;
break;
}
return ret;
}
int scanner(char *str){
stack *s;
int i = 0;
int ret = 1;
char c;
while (str[i] != '\0')
{
if (isleft(str[i]))
{
s->data[++s->top] = str[i];
}
if (isright(str[i]))
{
if (s->data[s->top] == '\0')
{
ret = 0;
return ret;
}
else
{
c = s->data[s->top];
if (check(str[i-1],c))
{
s->top--;
}else{
ret = 0;
return ret;
}
}
}
i++;
}
return ret;
}
int main(){
char str[max_size];
printf("请输入一段符号:");
fgets(str,sizeof(str)/sizeof(str[0]),stdin);
if (scanner(str) == 1)
{
printf("balance\n");
}else{
printf("no balance\n");
}
}
【以下回答由 GPT 生成】
问题分析: 1. 在函数scanner
中,stack
指针s
没有被初始化,导致在对s
进行操作时出现错误。 2. 函数stack
并没有被调用,因此需要添加代码来创建和释放栈。 3. 函数参数类型为char *
的指针,但是在主函数中没有传入字符串,因此需要在主函数中调用scanner
函数并传入字符串。 4. 没有包含头文件string.h
,导致编译错误。 5. 没有包含头文件stdlib.h
,导致编译错误。
修改建议:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max_size 21
typedef struct
{
char data[max_size];
int top;
}stack;
stack* create_stack(){
stack* s = (stack*)malloc(sizeof(stack));
s->top = -1;
return s;
}
void destroy_stack(stack* s){
free(s);
}
int isleft(char c){
int ret;
switch (c)
{
case '[':
case '{':
ret = 1;
break;
default:
ret = 0;
break;
}
return ret;
}
int isright(char c){
int ret;
switch (c)
{
case ']':
case '}':
ret = 1;
break;
default:
ret = 0;
break;
}
return ret;
}
int check(char left, char right){
int ret = 0;
switch (left)
{
case '[':
if (right == ']')
{
ret = 1;
}
break;
case '{':
if (right == '}')
{
ret = 1;
}
break;
default:
ret = 0;
break;
}
return ret;
}
int scanner(char *str){
stack* s = create_stack();
int i = 0;
int ret = 1;
char c;
while (str[i] != '\0')
{
c = str[i];
if (isleft(c))
{
s->top++;
s->data[s->top] = c;
}
else if (isright(c))
{
if (s->top == -1 || !check(s->data[s->top], c))
{
ret = 0;
break;
}
else
{
s->top--;
}
}
i++;
}
if (s->top != -1)
{
ret = 0;
}
destroy_stack(s);
return ret;
}
int main(){
char str[] = "{[()]}";
int result = scanner(str);
printf("括号匹配结果:%d\n", result);
return 0;
}
【相关推荐】
你这没有初始化直接用了
下面的i-1 改成i