数据结构课程设计(括号匹配的检验)

题目:

17、括号匹配的检验(限2人完成)
通过键盘输入一个表达式,其中包含圆括号和方括号(如:()[]),圆括号和方括号时成对出现,其中可以出现嵌套。嵌套形式如([]())或者[([][])]均为正确的格式,而[()或者([()]或者(()]均为错误格式。对输入的表达式,进行括号匹配的检查,如果匹配成功,返回1,匹配不成功,返回0。
具体实现:参考课本P76案例3.2。

 

代码:

#include <stdio.h> 
#include <stdlib.h> 
#define MAXSIZE 100 
typedef char SElemType; 
#define OK 0 
#define ERROR 1 
#define OVERFLOW -2 
typedef int Status; 

typedef struct
{
		SElemType   *base; 
		SElemType   *top; 
		Status stacksize; 
}SqStack;

Status InitStack(SqStack* S)
{
	S->base =(char*)malloc(sizeof(SElemType) * MAXSIZE);
	if( !S->base ) 	return OVERFLOW;
	S->top = S->base;
	S->stacksize = MAXSIZE;
	return OK;  
} 

Status StackLength( SqStack S )
{
	return S.top - S.base;
}

Status Push( SqStack* S, SElemType e)  
{
	if( S->top - S->base== S->stacksize )
        return ERROR; 
    *S->top++=e;
	return OK;
}

SElemType Pop( SqStack* S, SElemType e)
{
	if( S->top == S->base )
    {
        return 'w'; 
    }
	e=*--S->top;
	return e;
} 

Status DestroyStack( SqStack* S )
{
	if( S->base )
	{
		free(S->base);
		S->stacksize = 0;
		S->base = S->top = NULL;
	}
  return OK;
} 
  
Status isLeft(char c)  
{  
    Status ret = 0;  
     switch(c)  
     {  
        case '(':  
        case '[':
		case '<':    
        case '{':  
        case '\'':  
        case '\"':  
            ret = 1;  
            break;  
        default:  
            ret = 0;  
            break;  
                  
      }  
      return ret;  
}  
  
Status isRight(char c)  
{  
    Status ret = 0;  
     switch(c)  
     {    
        case ')':  
        case ']':
		case '>':  
        case '}':  
        case '\'':  
        case '\"':  
            ret = 1;  
            break;  
        default:  
            ret = 0;  
            break;  
                  
      }  
      return ret;  
}
 
Status match(char left, char right)  
{  
    Status ret = 0;  
      
    switch(left)  
    {    
        case '(':  
            ret = (right == ')');  
            break;  
        case '[':  
            ret = (right == ']');  
            break; 
		case '<':  
            ret = (right == '>');  
            break; 
        case '{':  
            ret = (right == '}');  
            break;  
        case '\'':  
            ret = (right == '\'');  
            break;  
        case '\"':  
            ret = (right == '\"');  
            break;  
        default:  
            ret = 0;  
            break;    
    }  
	return ret;
} 
 
Status judge(const char* code)  
{     
	SqStack stack;
	InitStack(&stack);
	Status ret=0;
    Status i=0;
      
    while( code[i] != '\0')
    {
        if(isLeft(code[i]))
        {
            Push(&stack,code[i]);
        }
        else if(isRight(code[i]))  
        {
           char c = Pop(&stack,*(stack.top)); 
           if(c=='w' || !match(c,code[i]))  
           {  
                printf("%c 匹配失败!\n",code[i]);
                break; 
           }
        }
        i++;
    }

    if((StackLength(stack)==0)&&(code[i]=='\0'))  
    {  
           printf("成功!\n");  
           ret = 1;  
    }  
    else if((StackLength(stack)!=0))
    {  
           printf("左括号有多余,匹配失败\n");
           ret = 0;   
    }  
    DestroyStack(&stack);
    return ret;  
}  
  
void main()  
{
	char* str = (char*)malloc(sizeof(char)*MAXSIZE) ;
	scanf("%s",str);
    judge(str);
    free(str); 
}

  

posted @ 2017-12-28 14:09  rainbowxch  阅读(4399)  评论(1编辑  收藏  举报