括号匹配算法

代码
// brackets_match.cpp : 定义控制台应用程序的入口点。
//

#include 
"stdafx.h"
#include 
"c1.h"
typedef 
char SElemType;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define MAX 100    
typedef 
struct{
    SElemType 
*base;
    SElemType 
*top;
    
int stacksize;
}SqStack;


Status InitStack(SqStack 
*S)
{
    (
*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    
if(!(*S).base)
        exit(OVERFLOW);
    (
*S).top=(*S).base;
    (
*S).stacksize=STACK_INIT_SIZE;
    
return OK;
}

Status StackEmpty(SqStack S)
{
    
if(S.top==S.base)
        
return TRUE;
    
else
        
return FALSE;
}

Status Push(SqStack 
*S,SElemType e)
{
    
if((*S).top-(*S).base>=(*S).stacksize)
    {
        (
*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
    
    
if(!(*S).base)
        exit(OVERFLOW);
    (
*S).top=(*S).base+(*S).stacksize;
    (
*S).stacksize+=STACKINCREMENT;
    }
    
*((*S).top++)=e;
    
return OK;
}

Status Pop(SqStack 
*S,SElemType *e)
{
    
if((*S).top==(*S).base)
        
return ERROR;
    
*e=*(--(*S).top);
    
return OK;
}

int leftbrackets(char c)
{
    
if(c=='('||c=='[')
        
return 1;
    
else 
        
return 0;
}

void match(char *newstr,char oldstr)
{
    
if(oldstr==')')
        
*newstr='(';
    
else if(oldstr==']')
        
*newstr='[';
    
else if(oldstr=='(')
        
*newstr=')';
    
else if(oldstr=='[')
        
*newstr=']';
}

int ismatch(char leftstr,char rightstr)
{
    
if(leftstr=='('&&rightstr==')')
        
return 1;
    
else if(leftstr=='['&&rightstr==']')
        
return 1;
    
else 
        
return 0;
}
char * brackets_match(char *newstr, char *oldstr, SqStack S)
{
    
int len,i=0,j=0;
    
char e;
    
//newstr=(char *)malloc(MAX*sizeof(char));
    len=strlen(oldstr);
    
while(i<len)
    {
        
//遇到的是右括号
        if(!leftbrackets(oldstr[i]))
        {
            
//如果栈为空,则在新字符串中将其与遇到的右括号配对
            if(StackEmpty(S))      
            {
                match(
&(newstr[j]),oldstr[i]);
                j
++;
                newstr[j]
=oldstr[i];
                i
++;
                j
++;
            }
            
//如果栈不为空,则出栈,并将出栈元素与遇到的右括号匹配
            else if(!StackEmpty(S))
            {
                Pop(
&S,&e);
                
//如果匹配,则将遇到的括号存到新字符串中
                if(ismatch(e,oldstr[i]))
                {
                    newstr[j]
=oldstr[i];
                    j
++;
                    i
++;
                }
                
//否则,存入一个与出栈的括号相匹配的括号
                else
                {
                    
/*match(&(newstr[j]),oldstr[i]);
                    j++;
                    newstr[j]=oldstr[i];
                    i++;
                    j++;
                    
*/
                    match(
&(newstr[j]),e);
                    j
++;
                }

            }
        }

        
//如果遇到的是左括号,则将左括号入栈,同时将其存入新字符串
        else if(leftbrackets(oldstr[i]))
        {
            Push(
&S,oldstr[i]);
            newstr[j]
=oldstr[i];
            j
++;
            i
++;
        }
    }

    
//如果栈中还有元素没有弹出,则将剩下的左括号弹出并将匹配的括号存到新字符串中
    while(!StackEmpty(S))
    {
        Pop(
&S,&e);
        match(
&(newstr[j]),e);
        j
++;
    }
    newstr[j]
='\0';
    
return newstr;
}





int _tmain(int argc, _TCHAR* argv[])
{
    SqStack S;
    
/*int e;
    InitStack(&S);
    int i;
    for(i=0;i<5;i++)
        Push(&S,i);
    for(i=0;i<5;i++)
    {
        Pop(&S,&e);
        printf("the element is %d\n",e);
    }
    
*/
    
    InitStack(
&S);
    
char *oldstr="([(](",*newstr;
    printf(
"the old str is %s\n",oldstr);
    newstr
=(char *)malloc(MAX*sizeof(char));
    newstr
=brackets_match(newstr,oldstr, S);

    printf(
"the new string is %s\n",newstr);

    
while(1);
    
return 0;
}

原文地址:https://www.cnblogs.com/newgreen/p/1853683.html