回 帖 发 新 帖 刷新版面

主题:括号匹配(用栈的)请大家棒改改,谢谢

#include <stdio.h>
#include <malloc.h>
#define M 100
typedef struct
{
 int str[M];
 int top;
}Seqstack;
void InitStack(Seqstack *s)

 s->top=-1;
}
int push(Seqstack *s,char x)
{
 if(s->top==M-1)
  return 0;
 s->top++;
 s->str[s->top]=x;
 return 1;
}
int pop(Seqstack *s,char *x)
{
 if(s->top=-1)
  return 0;
 else
 {
  *x=s->str[s->top];
  s->top--;
 }
}
int gettop(Seqstack *s,char x)
{
 if(s->top==-1)
  return 0;
 else
 {
  x=s->str[s->top];
  return 1;
 }
}
int isempty(Seqstack *s)
{
 if(s->top==-1)
  return 1;
 else 0;
}
int match(char ch,char b)
{
 
 if(ch==b)
  return 1;
}
int BrackeMatch(char *str)
{
 Seqstack *s;int i;char *ch,b;
 InitStack(s);
 for(i=0;str[i]!='\0';i++)
 {
  switch(str[i])
  {
  case'(':
  case'[':
  case'{':
    push(s,*ch);
    break;
  case')':
  case']':
  case'}':
   if(isempty(s))
   {printf("\n左括号多余!");return 0;}
   else
   {
    gettop(s,*ch);
    b=str[i];
    if(match(*ch,b))
     pop(s,ch);
    else
    {printf("\n对应的左右括号不同类!");return 0;}
   }
  }
 }
 if(isempty(s))
  printf("匹配!");
 else
  printf("\n不匹配!");
}
 
void main()
{
 int i;
 char x;
 char str[M];
     Seqstack *s;
 printf("请输入括号: \n");
 for(i=0;i<=M;i++)
  scanf("%s",str[i]);
 BrackeMatch(str);
}

回复列表 (共3个回复)

沙发


//我给你程序好好改了改可以实现的!

//顺序栈的括号匹配操作

#include <stdio.h>

#define M 100

typedef struct
{
    int stack[M];
    int top;  //栈顶指针
}Seqstack;

void InitStack(Seqstack &s)

    s.top=0;
}

int push(Seqstack &s,char x)
{
   if(s.top==M)  //栈已满
       return 0;
   s.stack[s.top]=x;  //添加元素
   s.top++;  //将栈顶加1
   return 1;
}

int pop(Seqstack &s,char &x) //出栈
{
   if(s.top==0) //空栈
       return 0;
   else
   {
       s.top--;
       x=s.stack[s.top]; 
       return 1;
   }
}

int gettop(Seqstack &s,char &x) //取栈顶元素
{
    if(s.top==0)
       return 0;
    else
    {
        x=s.stack[--s.top];
        return 1;
    }
}


int isempty(Seqstack &s) //判断是否为空
{
    if(s.top==0)
      return 1;
    else 
      return 0;
}


int match(char ch,char b)//匹配
{
    if((ch=='(' && b==')') || (ch=='[' && b==']') ||(ch=='{' && b=='}'))
        return 1;
    else
        return 0;
}

void BrackeMatch(char str[],int n)
{
    int i;
    bool flag;
    char ch,b;
    Seqstack s;//创建一个栈
    InitStack(s);
    if(n!=0 && n!=1)
    {
        for(i=0;i<n;++i)
        {
            switch(str[i])
            {
            case '(':
            case '[':
            case '{':
                push(s,str[i]);
                break;
            case ')':
            case ']':
            case '}':
                if(isempty(s))
                   printf("\n左括号多余!");
                else
                {
                    gettop(s,ch);
                    b=str[i];
                    if(match(ch,b))  //判断是否匹配
                    {
                        pop(s,ch);
                        flag=true;
                    }
                    else
                    {
                        flag=false;    
                        break;
                    }
                }
            }
        }
        if(flag)
            printf("匹配!\n");
        else
            printf("不匹配!\n");
    }
    else
        if(n==0)
            printf("没有任何括号!\n");
        else
            if(n==1)
                printf("只有一个括号,不匹配!\n");

}
 

void main()
{
    int i=0,length;
    char ch, str[M];
    //输入括号,输入q时候结束输入
    printf("请输入括号(press q to quit ): \n");
    while((ch=getchar())!='q')
    {
        str[i]=ch;
        ++i;
    }
    length=i;
    BrackeMatch(str,length);
}

板凳


还是有问题啊,不过谢谢你啊!

3 楼


这是我才上机我运行通过的:
#include <stdio.h>
#include <string.h>
# define stacksize 100

typedef struct segstack
{char data[stacksize];
int top;
}segstack;

void initstack(segstack *s)
{s->top=-1;}

int stackempty(segstack *s)
{return(s->top==-1);}

int stackfull(segstack *s)
{return(s->top==stacksize-1);}

void push(segstack *s,char p)
{if(stackfull(s))
printf("stack if full\n");
else
s->data[++s->top]=p;
}

char pop(segstack *s)
{char e;
if(stackempty(s))
printf("stack is empty\n");
else
{e=s->data[s->top];
s->top--;
return (e);
}
}

char stacktop(segstack *s)
{if(stackempty(s))
printf("stack is empty\n");
else
return(s->data[s->top]);
}

main()
{segstack *s;
char ch,q;
int t=1;
initstack(s);
ch=getchar();
while(ch!='#')
 {switch(ch)
  {case '(':push(s,ch);break;
   case '[':push(s,ch);break;
   case '{':push(s,ch);break;
   case ')':if(stacktop(s)=='(')q=pop(s);else t=0;break;
   case ']':if(stacktop(s)=='[')q=pop(s);else t=0;break;
   case '}':if(stacktop(s)=='{')q=pop(s);else t=0;break;
   default :break;
   }if(t==0)
    break;
    else
    ch=getchar();
 }
 if(!stackempty(s)||t==0)
 printf("not success\n");
 else
 printf("success\n");
 }


我来回复

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