用栈判断字符串是否合格

来源:互联网 发布:双拼com域名价格 编辑:程序博客网 时间:2024/05/23 19:19

用栈判断字符串是否合格

     题目:输入一个由“【”“】”,“{”“}”“《”“》”组成的字符串,规则是可以嵌套,但不能交叉,判断这个字符串是否符合规则。

     用栈,每次遇到右括号的时候就出栈,判断出栈元素是否是对应左括号即可。

     本来认为很好写,眼高手低了。各种Debug了好几个小时。

     代码+细节如下:

    

#include<stdio.h>#include<stdlib.h>#include<string.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef struct sqstack{char *base; /*变量类型定义的是指针内的元素,*/char *top;  /*至于下面指针做加减比较相等比较的是相对位置所代表的的数字。*/int stacksize;}sqstack;int initstack(sqstack *S){S->base = (char *)malloc(STACK_INIT_SIZE*sizeof(char));if(!S->base)return -1;S->top = S->base;S->stacksize = STACK_INIT_SIZE;return 1;}int push(sqstack *S,char e){if(S->top-S->base>=S->stacksize){S->base = (char *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(char));if(!S->base)return 0;S->top = S->base+S->stacksize;S->stacksize = S->stacksize+STACKINCREMENT;}*(S->top)= e; /*注意括号。*/S->top++;return 1;}int pop(sqstack *S,char *g){if(S->top==S->base)return -1;S->top--;*g = *(S->top); /*左边*取址,右边*取值。*/return 0;}int main(){int m,f,i;char g;sqstack S;char a[100];initstack(&S);scanf("%s",a);m = strlen(a)-1;f = 1;for(i = 0;i<=m;i++){if(a[i]=='{'||a[i]=='['||a[i]=='<'){push(&S,a[i]);}else{pop(&S,&g); /* & 操作变量。*/if(g=='{'&&a[i]!='}'){f = 0;break;}if(g=='['&&a[i]!=']'){f = 0;break;}if(g=='<'&&a[i]!='>'){f = 0;break;}}}if(f == 1) /*以前看到说这里只写一个 = 是可以运行的还不信,*/printf("correct\n"); /*自己写错了证明是可以运行的。当然运行结果是错误的。*/elseprintf("wrong\n");return 0;}


 

 

原创粉丝点击