#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; }
这是一个括号匹配问题 代码好像没有错 为什么运行的时候不可以呢?是有错误吗?
解决方案
2
严重性 代码 说明 项目 文件 行 禁止显示状态
警告 C4477 “scanf”: 格式字符串“%c”需要类型“char *”的参数,但可变参数 1 拥有了类型“int” Project1 c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c 61
警告 C4477 “scanf”: 格式字符串“%c”需要类型“char *”的参数,但可变参数 1 拥有了类型“int” Project1 c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c 61
8
scanf(“%c”,ch);
改成
scanf(“%c”,&ch);
改成
scanf(“%c”,&ch);
8
另外,scanf 接收 %c时,会将之前输入完留在缓冲区中的 \n接收了,所以建议改用getchar
8
给出你输入的内容和希望的结果
你前面的scanf(“%c”,&ch); 也改成用getchar
8
另外,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; }这个代码本人修改了 可是为什么执行的结果不正确呢?
给出你输入的内容和希望的结果
你前面的scanf(“%c”,&ch); 也改成用getchar本人把前面的scanf改成ch=getchar();但是结果还是不对
是不是 本人的算法有错?本来括号就是匹配的,它总出现括号不匹配!
Pop(&s,&ch); 这里的ch换一个变量,不然他把原来的c覆盖,你再比较没什么意思了
3
仅供参考:
#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); }