括号匹配问题

xinye1230 2016-10-09 06:38:42
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

#define OK 1
#define ERROR 0
typedef char ElemType;
typedef struct { /*建立一个栈的首结点*/
ElemType * base;
ElemType * top;
int stacksize;
} SqStack;
int InitStack(SqStack *s) { /*建立空的栈并返回首地址*/
s->base=((ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)));
if (!s->base) return ERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
int StackEmpty(SqStack *s) { /*判断栈是否为空*/
if (s->top==s->base) return OK;
else return ERROR;
}
int Push(SqStack *s,ElemType e) { /*往栈顶插入元素即进栈*/
if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));
if (!s->base) return ERROR;
s->stacksize+=STACKINCREMENT;
s->top=s->base+s->stacksize;
}
*s->top++=e;
return OK;
}
int Pop(SqStack *s,ElemType *e) { /*让栈顶元素依次输出即出栈*/
if (StackEmpty(s)) return ERROR;
*e=*(--s->top);
return OK;
}

int main()
{
char ch;
SqStack s;
char e;
InitStack(&s);
scanf("%c",&ch);
while(ch!='#')
{
if(ch=='('||ch=='['||ch=='{')
Push(&s,ch);
if(ch==')'||ch==']'||ch=='}')
{
if(StackEmpty(&s))
return ERROR;
Pop(&s,&e);
if(!((ch=='('&&ch!=')')||(ch=='['&&ch!=']')||(ch=='{'&&ch!='}')))
return ERROR;
}
scanf("%c",ch);
}
if(StackEmpty(&s))
return OK;
else
return ERROR;

}


这是一个括号匹配问题 代码好像没有错 为什么运行的时候不可以呢?是有错误吗?
...全文
200 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinye1230 2016-10-10
  • 打赏
  • 举报
回复
引用 8 楼 paschen 的回复:
[quote=引用 7 楼 xinye1230 的回复:] [quote=引用 6 楼 paschen 的回复:] [quote=引用 5 楼 xinye1230 的回复:] [quote=引用 3 楼 paschen 的回复:] 另外,scanf 接收 %c时,会将之前输入完留在缓冲区中的 \n接收了,所以建议改用getchar
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

#define OK 1
#define ERROR 0
typedef char ElemType;
typedef struct { /*建立一个栈的首结点*/
    ElemType * base;
    ElemType * top;
    int stacksize;
} SqStack;
int InitStack(SqStack *s) { /*建立空的栈并返回首地址*/
    s->base=((ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)));
    if (!s->base) return ERROR;
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
    return OK;
}
int StackEmpty(SqStack *s) { /*判断栈是否为空*/
    if (s->top==s->base) return OK;
    else                 return ERROR;
}
int Push(SqStack *s,ElemType ch) { /*往栈顶插入元素即进栈*/
    if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
        s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));
        if (!s->base) return ERROR;
        s->stacksize+=STACKINCREMENT;
        s->top=s->base+s->stacksize;
    }
    *s->top++=ch;
    return OK;
}
int Pop(SqStack *s,ElemType *ch) { /*让栈顶元素依次输出即出栈*/
    if (StackEmpty(s)) return ERROR;
    *ch=*(--s->top);
    return OK;
}

int main()
{
	char ch;
	SqStack s;
	InitStack(&s);
	scanf("%c",&ch);
	while(ch!='#')
	{
		if(ch=='('||ch=='['||ch=='{')
			Push(&s,ch);
		if(ch==')'||ch==']'||ch=='}')
		{
			if(StackEmpty(&s))
			{
			
				printf("右多\n");
				return 0;
			}
			Pop(&s,&ch);
			if((ch=='('&&ch!=')')||(ch=='['&&ch!=']')||(ch=='{'&&ch!='}'))
			{
				
				printf("左右不匹配\n");
				return 0;
			}
		}
		ch=getchar();
	}
	if(!StackEmpty(&s))
	{
	
		printf("左多\n");
		return 0;
	}
	else
	{
	
		printf("正确\n");
		return 1;
	}
	return 0;

}
这个代码我修改了 可是为什么执行的结果不正确呢?[/quote] 给出你输入的内容和希望的结果 你前面的scanf("%c",&ch); 也改成用getchar[/quote] 我把前面的scanf改成ch=getchar();但是结果还是不对 是不是 我的算法有错?本来括号就是匹配的,它总出现括号不匹配![/quote] Pop(&s,&ch); 这里的ch换一个变量,不然他把原来的c覆盖,你再比较没什么意思了[/quote] 我改成其他变量了 结果正确了 谢谢你。
xinye1230 2016-10-10
  • 打赏
  • 举报
回复
谢谢 赵四老师、
paschen 2016-10-10
  • 打赏
  • 举报
回复
引用 5 楼 xinye1230 的回复:
[quote=引用 3 楼 paschen 的回复:] 另外,scanf 接收 %c时,会将之前输入完留在缓冲区中的 \n接收了,所以建议改用getchar
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

#define OK 1
#define ERROR 0
typedef char ElemType;
typedef struct { /*建立一个栈的首结点*/
    ElemType * base;
    ElemType * top;
    int stacksize;
} SqStack;
int InitStack(SqStack *s) { /*建立空的栈并返回首地址*/
    s->base=((ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)));
    if (!s->base) return ERROR;
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
    return OK;
}
int StackEmpty(SqStack *s) { /*判断栈是否为空*/
    if (s->top==s->base) return OK;
    else                 return ERROR;
}
int Push(SqStack *s,ElemType ch) { /*往栈顶插入元素即进栈*/
    if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
        s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));
        if (!s->base) return ERROR;
        s->stacksize+=STACKINCREMENT;
        s->top=s->base+s->stacksize;
    }
    *s->top++=ch;
    return OK;
}
int Pop(SqStack *s,ElemType *ch) { /*让栈顶元素依次输出即出栈*/
    if (StackEmpty(s)) return ERROR;
    *ch=*(--s->top);
    return OK;
}

int main()
{
	char ch;
	SqStack s;
	InitStack(&s);
	scanf("%c",&ch);
	while(ch!='#')
	{
		if(ch=='('||ch=='['||ch=='{')
			Push(&s,ch);
		if(ch==')'||ch==']'||ch=='}')
		{
			if(StackEmpty(&s))
			{
			
				printf("右多\n");
				return 0;
			}
			Pop(&s,&ch);
			if((ch=='('&&ch!=')')||(ch=='['&&ch!=']')||(ch=='{'&&ch!='}'))
			{
				
				printf("左右不匹配\n");
				return 0;
			}
		}
		ch=getchar();
	}
	if(!StackEmpty(&s))
	{
	
		printf("左多\n");
		return 0;
	}
	else
	{
	
		printf("正确\n");
		return 1;
	}
	return 0;

}
这个代码我修改了 可是为什么执行的结果不正确呢?[/quote] 给出你输入的内容和希望的结果 你前面的scanf("%c",&ch); 也改成用getchar
赵4老师 2016-10-10
  • 打赏
  • 举报
回复
仅供参考:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 10
#define STACK_GROW_SIZE 5
#define ELEMTYPE char
#define OK 1
#define ERROR 0
typedef struct { /*建立一个栈的首结点*/
    ELEMTYPE * base;
    ELEMTYPE * top;
    int stacksize;
} SpStack;
int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/
    s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));
    if (!s->base) return ERROR;
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
    return OK;
}
int StackEmpty(SpStack *s) { /*判断栈是否为空*/
    if (s->top==s->base) return OK;
    else                 return ERROR;
}
int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/
    if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
        s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));
        if (!s->base) return ERROR;
        s->stacksize+=STACK_GROW_SIZE;
        s->top=s->base+s->stacksize;
    }
    *s->top++=e;
    return OK;
}
int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/
    if (StackEmpty(s)) return ERROR;
    *e=*(--s->top);
    return OK;
}
int Comp(ELEMTYPE a,ELEMTYPE b) {
    if ((a=='('&&b!=')')
      ||(a=='['&&b!=']')
      ||(a=='{'&&b!='}')) {
        return ERROR;
    } else return OK;
}
int Count(SpStack *s) {
    ELEMTYPE e[STACK_INIT_SIZE*2];
    ELEMTYPE e1;
    int i;

    InitStack(s);
    fgets(e,STACK_INIT_SIZE*2,stdin);
    if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;
    printf("%s\n",e);
    for (i=0;e[i]!='\0';i++) {
        switch (e[i]) {
        case '(':
        case '[':
        case '{':
            Push(s,e[i]);
            break;
        case ')':
        case ']':
        case '}':
            if (StackEmpty(s)) {
                printf("%*s↖右括号多余\n",i+1,"");
                return(ERROR);
            } else Pop(s,&e1);
            if (!Comp(e1,e[i])) {
                printf("%*s↖左右匹配出错\n",i+1,"");
                return(ERROR);
            }
        }
    }
    if (!StackEmpty(s)) {
        printf("%*s↖左括号多余\n",i,"");
        return(ERROR);
    } else {
        printf("匹配正确\n");
        return(OK);
    }
}
void main() {
    SpStack s;
    Count(&s);
    free(s.base);
}
paschen 2016-10-10
  • 打赏
  • 举报
回复
引用 7 楼 xinye1230 的回复:
[quote=引用 6 楼 paschen 的回复:] [quote=引用 5 楼 xinye1230 的回复:] [quote=引用 3 楼 paschen 的回复:] 另外,scanf 接收 %c时,会将之前输入完留在缓冲区中的 \n接收了,所以建议改用getchar
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

#define OK 1
#define ERROR 0
typedef char ElemType;
typedef struct { /*建立一个栈的首结点*/
    ElemType * base;
    ElemType * top;
    int stacksize;
} SqStack;
int InitStack(SqStack *s) { /*建立空的栈并返回首地址*/
    s->base=((ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)));
    if (!s->base) return ERROR;
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
    return OK;
}
int StackEmpty(SqStack *s) { /*判断栈是否为空*/
    if (s->top==s->base) return OK;
    else                 return ERROR;
}
int Push(SqStack *s,ElemType ch) { /*往栈顶插入元素即进栈*/
    if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
        s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));
        if (!s->base) return ERROR;
        s->stacksize+=STACKINCREMENT;
        s->top=s->base+s->stacksize;
    }
    *s->top++=ch;
    return OK;
}
int Pop(SqStack *s,ElemType *ch) { /*让栈顶元素依次输出即出栈*/
    if (StackEmpty(s)) return ERROR;
    *ch=*(--s->top);
    return OK;
}

int main()
{
	char ch;
	SqStack s;
	InitStack(&s);
	scanf("%c",&ch);
	while(ch!='#')
	{
		if(ch=='('||ch=='['||ch=='{')
			Push(&s,ch);
		if(ch==')'||ch==']'||ch=='}')
		{
			if(StackEmpty(&s))
			{
			
				printf("右多\n");
				return 0;
			}
			Pop(&s,&ch);
			if((ch=='('&&ch!=')')||(ch=='['&&ch!=']')||(ch=='{'&&ch!='}'))
			{
				
				printf("左右不匹配\n");
				return 0;
			}
		}
		ch=getchar();
	}
	if(!StackEmpty(&s))
	{
	
		printf("左多\n");
		return 0;
	}
	else
	{
	
		printf("正确\n");
		return 1;
	}
	return 0;

}
这个代码我修改了 可是为什么执行的结果不正确呢?[/quote] 给出你输入的内容和希望的结果 你前面的scanf("%c",&ch); 也改成用getchar[/quote] 我把前面的scanf改成ch=getchar();但是结果还是不对 是不是 我的算法有错?本来括号就是匹配的,它总出现括号不匹配![/quote] Pop(&s,&ch); 这里的ch换一个变量,不然他把原来的c覆盖,你再比较没什么意思了
xinye1230 2016-10-10
  • 打赏
  • 举报
回复
引用 6 楼 paschen 的回复:
[quote=引用 5 楼 xinye1230 的回复:]
[quote=引用 3 楼 paschen 的回复:]
另外,scanf 接收 %c时,会将之前输入完留在缓冲区中的 \n接收了,所以建议改用getchar

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

#define OK 1
#define ERROR 0
typedef char ElemType;
typedef struct { /*建立一个栈的首结点*/
ElemType * base;
ElemType * top;
int stacksize;
} SqStack;
int InitStack(SqStack *s) { /*建立空的栈并返回首地址*/
s->base=((ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)));
if (!s->base) return ERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
int StackEmpty(SqStack *s) { /*判断栈是否为空*/
if (s->top==s->base) return OK;
else return ERROR;
}
int Push(SqStack *s,ElemType ch) { /*往栈顶插入元素即进栈*/
if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));
if (!s->base) return ERROR;
s->stacksize+=STACKINCREMENT;
s->top=s->base+s->stacksize;
}
*s->top++=ch;
return OK;
}
int Pop(SqStack *s,ElemType *ch) { /*让栈顶元素依次输出即出栈*/
if (StackEmpty(s)) return ERROR;
*ch=*(--s->top);
return OK;
}

int main()
{
char ch;
SqStack s;
InitStack(&s);
scanf("%c",&ch);
while(ch!='#')
{
if(ch=='('||ch=='['||ch=='{')
Push(&s,ch);
if(ch==')'||ch==']'||ch=='}')
{
if(StackEmpty(&s))
{

printf("右多\n");
return 0;
}
Pop(&s,&ch);
if((ch=='('&&ch!=')')||(ch=='['&&ch!=']')||(ch=='{'&&ch!='}'))
{

printf("左右不匹配\n");
return 0;
}
}
ch=getchar();
}
if(!StackEmpty(&s))
{

printf("左多\n");
return 0;
}
else
{

printf("正确\n");
return 1;
}
return 0;

}

这个代码我修改了 可是为什么执行的结果不正确呢?[/quote]

给出你输入的内容和希望的结果

你前面的scanf("%c",&ch); 也改成用getchar[/quote]

我把前面的scanf改成ch=getchar();但是结果还是不对

是不是 我的算法有错?本来括号就是匹配的,它总出现括号不匹配!
xinye1230 2016-10-09
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
另外,scanf 接收 %c时,会将之前输入完留在缓冲区中的 \n接收了,所以建议改用getchar
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

#define OK 1
#define ERROR 0
typedef char ElemType;
typedef struct { /*建立一个栈的首结点*/
    ElemType * base;
    ElemType * top;
    int stacksize;
} SqStack;
int InitStack(SqStack *s) { /*建立空的栈并返回首地址*/
    s->base=((ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)));
    if (!s->base) return ERROR;
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
    return OK;
}
int StackEmpty(SqStack *s) { /*判断栈是否为空*/
    if (s->top==s->base) return OK;
    else                 return ERROR;
}
int Push(SqStack *s,ElemType ch) { /*往栈顶插入元素即进栈*/
    if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
        s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));
        if (!s->base) return ERROR;
        s->stacksize+=STACKINCREMENT;
        s->top=s->base+s->stacksize;
    }
    *s->top++=ch;
    return OK;
}
int Pop(SqStack *s,ElemType *ch) { /*让栈顶元素依次输出即出栈*/
    if (StackEmpty(s)) return ERROR;
    *ch=*(--s->top);
    return OK;
}

int main()
{
	char ch;
	SqStack s;
	InitStack(&s);
	scanf("%c",&ch);
	while(ch!='#')
	{
		if(ch=='('||ch=='['||ch=='{')
			Push(&s,ch);
		if(ch==')'||ch==']'||ch=='}')
		{
			if(StackEmpty(&s))
			{
			
				printf("右多\n");
				return 0;
			}
			Pop(&s,&ch);
			if((ch=='('&&ch!=')')||(ch=='['&&ch!=']')||(ch=='{'&&ch!='}'))
			{
				
				printf("左右不匹配\n");
				return 0;
			}
		}
		ch=getchar();
	}
	if(!StackEmpty(&s))
	{
	
		printf("左多\n");
		return 0;
	}
	else
	{
	
		printf("正确\n");
		return 1;
	}
	return 0;

}
这个代码我修改了 可是为什么执行的结果不正确呢?
xinye1230 2016-10-09
  • 打赏
  • 举报
回复
引用 1 楼 dustpg 的回复:
严重性 代码 说明 项目 文件 行 禁止显示状态 警告 C4477 “scanf”: 格式字符串“%c”需要类型“char *”的参数,但可变参数 1 拥有了类型“int” Project1 c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c 61
什么意思?
paschen 2016-10-09
  • 打赏
  • 举报
回复
另外,scanf 接收 %c时,会将之前输入完留在缓冲区中的 \n接收了,所以建议改用getchar
paschen 2016-10-09
  • 打赏
  • 举报
回复
scanf("%c",ch); 改成 scanf("%c",&ch);
dustpg 2016-10-09
  • 打赏
  • 举报
回复
严重性 代码 说明 项目 文件 行 禁止显示状态 警告 C4477 “scanf”: 格式字符串“%c”需要类型“char *”的参数,但可变参数 1 拥有了类型“int” Project1 c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c 61

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧