• 括号匹配算法


    代码
    // 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;
    }

  • 相关阅读:
    游戏运营-三节课
    游戏运营-游戏付费
    游戏运营--资深
    django 导出csv
    django-分页
    django-中间件
    django-缓存
    django post 与get请求理解
    django 中遇到的问题
    Linux下使用XAMPP
  • 原文地址:https://www.cnblogs.com/newgreen/p/1853683.html
Copyright © 2020-2023  润新知