首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

栈查验括号序列,用文件

2013-12-17 
栈检验括号序列,用文件请帮我改代码,不要只说大概,为什么打开内容为“{[()[()]]”的“xxx.txt”文件,程序显示“

栈检验括号序列,用文件
请帮我改代码,不要只说大概,为什么打开内容为“{[()[()]]”的“xxx.txt”文件,程序显示“括号不匹配!”,应该为“缺乏右括号啊”

#define INITSTACKSIZE 50
#define INCREMENT 10
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct
{
char *top;
char *base;
int stacksize;
}Stack;
void Push(Stack &s,char c)
{
if((s.top-s.base)>=s.stacksize)
s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char));
if(!s.base)
exit(0);
s.top=s.base+s.stacksize;
s.stacksize+=INCREMENT;
*s.top++=c;
}
void Pop(Stack &s,char &c)
{
if(s.top==s.base)
exit(0);
c=*--s.top;
}
int StackEmpty(Stack s)
{
if(s.top==s.base)
return 1;
else
return 0;
}
void InitStack(Stack &a)
{
a.base=(char*)malloc(INITSTACKSIZE*sizeof(char));
if(!a.base)
{
printf("分配空间失败!\n");
exit(-1);
}
a.top=a.base;
a.stacksize=INITSTACKSIZE;
}
int main()
{   
FILE *fp;
Stack s;
char a[100],b[100],e;
char *p;
printf("请输入您要读取的文件名:\n");
gets(a);
fp=fopen(a,"r");
if(fp==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
else
{
printf("文件打开成功!\n");
}
fscanf(fp,"%s",b);
fclose(fp);
puts(b);
InitStack(s);
p=b;
 while(*p) // 没到串尾
     switch(*p)
     {
       case '(':
       case '[':
       case '{':Push(s,*p++); // 左括号入栈,且p++
                break;
       case ')':
       case ']':
       case '}':if(!StackEmpty(s)) // 栈不空
                {
                  Pop(s,e); // 弹出栈顶元素
                  if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))
                  { // 出现3种匹配情况之外的情况
                    printf("左右括号不配对\n");
                    exit(0);
                  }
                }
                else // 栈空
                {
                  printf("缺乏左括号\n");
                  exit(0);
                }
       default: p++; // 其它字符不处理,指针向后移
     }
   if(StackEmpty(s)) // 字符串结束时栈空
     printf("括号匹配\n");
   else
     printf("缺乏右括号\n");

return 0;
}


[解决办法]
可否先把语法错误都改好?

引用:
请帮我改代码,不要只说大概,为什么打开内容为“{[()[()]]”的“xxx.txt”文件,程序显示“括号不匹配!”,应该为“缺乏右括号啊”
#define INITSTACKSIZE 50
#define INCREMENT 10
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct
{
char *top;
char *base;
int stacksize;
}Stack;
void Push(Stack &s,char c)
{
if((s.top-s.base)>=s.stacksize)
s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char));
if(!s.base)
exit(0);
s.top=s.base+s.stacksize;
s.stacksize+=INCREMENT;
*s.top++=c;
}
void Pop(Stack &s,char &c)


{
if(s.top==s.base)
exit(0);
c=*--s.top;
}
int StackEmpty(Stack s)
{
if(s.top==s.base)
return 1;
else
return 0;
}
void InitStack(Stack &a)
{
a.base=(char*)malloc(INITSTACKSIZE*sizeof(char));
if(!a.base)
{
printf("分配空间失败!\n");
exit(-1);
}
a.top=a.base;
a.stacksize=INITSTACKSIZE;
}
int main()
{   
FILE *fp;
Stack s;
char a[100],b[100],e;
char *p;
printf("请输入您要读取的文件名:\n");
gets(a);
fp=fopen(a,"r");
if(fp==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
else
{
printf("文件打开成功!\n");
}
fscanf(fp,"%s",b);
fclose(fp);
puts(b);
InitStack(s);
p=b;
 while(*p) // 没到串尾
     switch(*p)
     {
       case '(':
       case '[':
       case '{':Push(s,*p++); // 左括号入栈,且p++
                break;
       case ')':
       case ']':
       case '}':if(!StackEmpty(s)) // 栈不空
                {
                  Pop(s,e); // 弹出栈顶元素
                  if(!(e=='('&&*p==')'
[解决办法]
e=='['&&*p==']'
[解决办法]
e=='{'&&*p=='}'))
                  { // 出现3种匹配情况之外的情况
                    printf("左右括号不配对\n");
                    exit(0);
                  }
                }
                else // 栈空
                {
                  printf("缺乏左括号\n");
                  exit(0);
                }
       default: p++; // 其它字符不处理,指针向后移
     }
   if(StackEmpty(s)) // 字符串结束时栈空
     printf("括号匹配\n");
   else
     printf("缺乏右括号\n");

return 0;
}


[解决办法]
帮你改了,记得给分。
#define INITSTACKSIZE 50
#define INCREMENT 10
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct
{
//char *top;
char *base;
unsigned int count;//元素个数
unsigned int stacksize;//内存空间
}Stack;
void Push(Stack &s,char c)
{
if(/*(s.top-s.base)*/s.count>=s.stacksize)
{
s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char));
if(!s.base)
exit(0);
s.stacksize+=INCREMENT;
}
//s.top=s.base+s.stacksize;

*(s.base+s.count) = c;
s.count ++;
//*s.top++=c;
}
bool Pop(Stack &s,char &c)
{
//if(s.top==s.base)
//exit(0);
if(s.count == 0)
return false;
c = *(s.base+s.count-1);
s.count --;
//c=*--s.top;
return true;
}
int StackEmpty(Stack s)
{
//if(s.top==s.base)
if(s.count == 0)
return 1;
else
return 0;
}
void InitStack(Stack &a)
{
a.base=(char*)malloc(INITSTACKSIZE*sizeof(char));
if(!a.base)
{
printf("分配空间失败!\n");
exit(-1);
}
a.count = 0;
//a.top=a.base;
a.stacksize=INITSTACKSIZE;
}
int main()
{   
FILE *fp;
Stack s;
char a[100],b[100],e;
char *p;
printf("请输入您要读取的文件名:\n");
gets(a);
fp=fopen(a,"r");
if(fp==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
else
{
printf("文件打开成功!\n");
}
fscanf(fp,"%s",b);
fclose(fp);
puts(b);
InitStack(s);
p=b;
 while(*p) // 没到串尾
     switch(*p)
     {
       case '(':
       case '[':
       case '{':Push(s,*p++); // 左括号入栈,且p++


                break;
       case ')':
       case ']':
       case '}':if(!StackEmpty(s)) // 栈不空
                {
                  Pop(s,e); // 弹出栈顶元素
                  if(!(e=='('&&*p==')'
[解决办法]
e=='['&&*p==']'
[解决办法]
e=='{'&&*p=='}'))
                  { // 出现3种匹配情况之外的情况
                    printf("左右括号不配对\n");
                    exit(0);
                  }
                }
                else // 栈空
                {
                  printf("缺乏左括号\n");
                  exit(0);
                }
       default: p++; // 其它字符不处理,指针向后移
     }
   if(StackEmpty(s)) // 字符串结束时栈空
     printf("括号匹配\n");
   else
     printf("缺乏右括号\n");

return 0;
}
[解决办法]
如我在10楼的答案,栈的结构不正确,另外楼掉了一个p++。

引用:
帮你改了,记得给分。
#define INITSTACKSIZE 50
#define INCREMENT 10
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct
{
//char *top;
char *base;
unsigned int count;//元素个数
unsigned int stacksize;//内存空间
}Stack;
void Push(Stack &s,char c)
{
if(/*(s.top-s.base)*/s.count>=s.stacksize)
{
s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char));
if(!s.base)
exit(0);
s.stacksize+=INCREMENT;
}
//s.top=s.base+s.stacksize;

*(s.base+s.count) = c;
s.count ++;
//*s.top++=c;
}
bool Pop(Stack &s,char &c)
{
//if(s.top==s.base)
//exit(0);
if(s.count == 0)
return false;
c = *(s.base+s.count-1);
s.count --;
//c=*--s.top;
return true;
}
int StackEmpty(Stack s)
{
//if(s.top==s.base)
if(s.count == 0)
return 1;
else
return 0;
}
void InitStack(Stack &a)
{
a.base=(char*)malloc(INITSTACKSIZE*sizeof(char));
if(!a.base)
{
printf("分配空间失败!\n");
exit(-1);
}
a.count = 0;
//a.top=a.base;
a.stacksize=INITSTACKSIZE;
}
int main()
{   
FILE *fp;
Stack s;
char a[100],b[100],e;
char *p;
printf("请输入您要读取的文件名:\n");
gets(a);
fp=fopen(a,"r");
if(fp==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
else
{
printf("文件打开成功!\n");
}
fscanf(fp,"%s",b);
fclose(fp);
puts(b);
InitStack(s);
p=b;
 while(*p) // 没到串尾
     switch(*p)
     {
       case '(':
       case '[':
       case '{':Push(s,*p++); // 左括号入栈,且p++
                break;
       case ')':
       case ']':
       case '}':if(!StackEmpty(s)) // 栈不空
                {
                  Pop(s,e); // 弹出栈顶元素
                  if(!(e=='('&&*p==')'
[解决办法]
e=='['&&*p==']'
[解决办法]
e=='{'&&*p=='}'))
                  { // 出现3种匹配情况之外的情况
                    printf("左右括号不配对\n");


                    exit(0);
                  }
                }
                else // 栈空
                {
                  printf("缺乏左括号\n");
                  exit(0);
                }
       default: p++; // 其它字符不处理,指针向后移
     }
   if(StackEmpty(s)) // 字符串结束时栈空
     printf("括号匹配\n");
   else
     printf("缺乏右括号\n");

return 0;
}


[解决办法]
仅供参考
#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);
}

热点排行