回 帖 发 新 帖 刷新版面

主题:高手请进,帮我看看括号匹配程序哪出了错

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{int *base;
 int *top;
 int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
 s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
 if(!s.base) return ERROR;
 s.top=s.base;
 s.stacksize=STACK_INIT_SIZE;
 return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
 if(s.top-s.base>=s.stacksize)
 {s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
  if(!s.base) return ERROR;
  s.top=s.base+s.stacksize;
  s.stacksize+=STACKINCREMENT;
 }
 *s.top++=e;
 return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
    if(s.base==s.top) return ERROR;
    e=*--s.top;
    return OK;
}
Status StackEmpty(SqStack s)
{if(s.base==s.top) return 1;
 else return 0;
}
main()
{char ch1,ch2,c[100];int i;
 SqStack s;
 printf("请输入包括括号表达式:");
 scanf("%s",c);
 i=0;
 while(ch1=c[i])
 {if(ch1=='('||ch1=='{'||ch1=='[')
    push(s,ch1);
  if(ch1==')' ||ch1==']' ||ch1=='}')
      if(StackEmpty(s)) {return ERROR;printf("表达式中的括号不匹配!");}
        else {pop(s,ch2);
              if(ch1=='(' && ch2!=')') {return ERROR;printf("表达式中的括号不匹配!");}
              if(ch1=='[' && ch2!=']') {return ERROR;printf("表达式中的括号不匹配!");}
              if(ch1=='{' && ch2!='}') {return ERROR;printf("表达式中的括号不匹配!");}
        }
        i++;
 }
 if(!StackEmpty(s)) return ERROR;
 printf("表达式中的括号匹配!");
}

以上程序,可以通过,但是调试不出结果,麻烦高手们指点一下!

回复列表 (共9个回复)

沙发

结构有些模糊:
while(ch1=c[i++])//这样写不是很好吗?
 {if(ch1=='('||ch1=='{'||ch1=='[')
    push(s,ch1);
  else if(ch1==')' ||ch1==']' ||ch1=='}')
  {     if(StackEmpty(s)) {return ERROR;printf("表达式中的括号不匹配!");}
        pop(s,ch2);
        if(ch2=='(' && ch1!=')') {return ERROR;printf("表达式中的括号不匹配!");}
        if(ch2=='[' && ch1!=']') {return ERROR;printf("表达式中的括号不匹配!");}
        if(ch2=='{' && ch1!='}') {return ERROR;printf("表达式中的括号不匹配!");}
  }
 }
ch1是从串里出来的应该是右括号,ch2从栈里出来应该是左括号。

板凳

if(StackEmpty(s)) {return ERROR;printf("表达式中的括号不匹配!");}
再改成
if(StackEmpty(s)) {printf("表达式中的括号不匹配!");return ERROR;}

3 楼

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{int *base;
 int *top;
 int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
 s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
 if(!s.base) return ERROR;
 s.top=s.base;
 s.stacksize=STACK_INIT_SIZE;
 return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
 if(s.top-s.base>=s.stacksize)
 {s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
  if(!s.base) return ERROR;
  s.top=s.base+s.stacksize;
  s.stacksize+=STACKINCREMENT;
 }
 *s.top++=e;
 return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
    if(s.base==s.top) return ERROR;
    e=*--s.top;
    return OK;
}
Status StackEmpty(SqStack s)
{if(s.base==s.top) return 1;
 else return 0;
}
main()
{char ch1,ch2,c[100];int i;
 SqStack s;
 InitStack(s);
 printf("请输入包括括号表达式:");
 scanf("%s",c);
 i=0;
 while(ch1=c[ii++])
 {if(ch1=='('||ch1=='{'||ch1=='[')
    push(s,ch1);
  else if(ch1==')' ||ch1==']' ||ch1=='}')
         if(StackEmpty(s)) {printf("表达式中的括号不匹配!\n");return ERROR;}
         else {pop(s,ch2);
              if(ch2=='(' && ch1!=')') {printf("表达式中的括号不匹配!\n");return ERROR;}
              if(ch2=='[' && ch1!=']') {printf("表达式中的括号不匹配!\n");return ERROR;}
              if(ch2=='{' && ch1!='}') {printf("表达式中的括号不匹配!\n");return ERROR;}
               }
        
 }
 if(!StackEmpty(s)) {printf("表达式中的括号不匹配!\n"); return ERROR;}
 printf("表达式中的括号匹配!");
 printf("\n");
}

谢谢,我调试出来了,把程序发给大家

4 楼

经过高手的指点,再把改进的给大家传过来
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{int *base;
 int *top;
 int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
 s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
 if(!s.base) return ERROR;
 s.top=s.base;
 s.stacksize=STACK_INIT_SIZE;
 return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
 if(s.top-s.base>=s.stacksize)
 {s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
  if(!s.base) return ERROR;
  s.top=s.base+s.stacksize;
  s.stacksize+=STACKINCREMENT;
 }
 *s.top++=e;
 return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
    if(s.base==s.top) return ERROR;
    e=*--s.top;
    return OK;
}
Status StackEmpty(SqStack s)
{if(s.base==s.top) return 1;
 else return 0;
}
main()
{char ch1,ch2,c[100];int i;
 SqStack s;
 InitStack(s);
 printf("请输入包括括号表达式:");
 scanf("%s",c);
 i=0;
 while(ch1=c[i++])
 {if(ch1=='('||ch1=='{'||ch1=='[')
    push(s,ch1);
  else if(ch1==')' ||ch1==']' ||ch1=='}')
  {    if(StackEmpty(s)) {printf("表达式中的括号不匹配!\n");return ERROR;}
         pop(s,ch2);
         if(ch2=='(' && ch1!=')') {printf("表达式中的括号不匹配!\n");return ERROR;}
         if(ch2=='[' && ch1!=']') {printf("表达式中的括号不匹配!\n");return ERROR;}
         if(ch2=='{' && ch1!='}') {printf("表达式中的括号不匹配!\n");return ERROR;}
  }
 
 }
 if(!StackEmpty(s)) {printf("表达式中的括号不匹配!\n"); return ERROR;}
 printf("表达式中的括号匹配!");
 printf("\n");
}

5 楼

你很高兴啊,很喜欢编程吗?

6 楼


如果把if的换成switch会更精简我认为[em3]

7 楼

#include <iostream.h>
#include <conio.h>
#include <string.h>
void main()

{
    char str[20];
    char stack[20];
    char* p=stack;
    int i=0;
    bool Match=true;
    cout<<"Input: "<<endl;
    cin>>str;
    cout<<str<<endl;
    for(i=0;i<strlen(str)&&Match;i++)
    {
        switch(str[i]){
        case '(':
        case '[':
            *p++=str[i];
            break;
        case ')':
            if(*--p!='(')
            {
                cout<<"Not Match"<<endl;
                Match=false;
            }
            break;
        case ']':

            if(*--p!='[')
            {
                cout<<"Not Match"<<endl;
                Match=false;
            }
            break;
        default:
            cout<<"Input Error!"<<endl;
            break;
        }
    }
    if(Match)
        cout<<"Match"<<endl;
    getche();
}

8 楼

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{int *base;
 int *top;
 int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
 s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
 if(!s.base) return ERROR;
 s.top=s.base;
 s.stacksize=STACK_INIT_SIZE;
 return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
 if(s.top-s.base>=s.stacksize)
 {s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
  if(!s.base) return ERROR;
  s.top=s.base+s.stacksize;
  s.stacksize+=STACKINCREMENT;
 }
 *s.top++=e;
 return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
    if(s.base==s.top) return ERROR;
    e=*--s.top;
    return OK;
}
Status StackEmpty(SqStack s)
{if(s.base==s.top) return 1;
 else return 0;
}
Status GetTop(SqStack s,char &e)
{//若栈不空,则用e返回s的栈顶元素,并返回OK,否则返回ERROR
    if(s.top==s.base) return ERROR;
    e=*(s.top-1);
    return(e);
}
void matching()
{int state=1;char c,e; SqStack s;
 InitStack(s);
 printf("请输入包括括号的表达式:");
 while(state && (c=getchar())!='\n')
 {switch(c)
 {case'[':
  case'(': push(s,c); break;
  case')': if(!StackEmpty(s)&& GetTop(s,e)=='(') pop(s,e);
            else state=0; break;
  case ']':if(!StackEmpty(s)&& GetTop(s,e)=='[') pop(s,e);
            else state=0; break;

 }//switch
 }//while
 if(StackEmpty(s) && state)  printf("括号匹配!");
 else printf("括号不匹配");
 printf("\n");

}
main()
{matching();
}

9 楼


七楼的你到底是想实现什么功能啊?
你那些代码根本就用不了。
单纯是输入了一串字符之后就打出,然后无论输些什么,都显示input error.
我晕

我来回复

您尚未登录,请登录后再回复。点此登录或注册