數據結構課程設計(括號匹配的檢驗)


題目:

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); 
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM