括號{}()[]匹配

使用棧來實現

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX 100

typedef struct elem
{
    int date;
};

typedef struct LinkStack
{
    elem elem_date;
    LinkStack *next;
}LinkStack;

//初始化
void Init(LinkStack **top)//棧只有頭,沒有底
{
    *top = (LinkStack*)malloc(sizeof(LinkStack));
    (*top)->next = NULL;
}

//入棧
int push(LinkStack *Top, int date)
{
    LinkStack *p = (LinkStack*)malloc(sizeof(LinkStack));
    if (p == NULL)
    {
        printf("申請空間失敗\n");
        return -1;
    }
    p->elem_date.date = date;
    p->next = Top->next;
    Top->next = p;
    return 0;
}

//出棧
int pop(LinkStack *top, int &date)
{
    if (top->next == NULL)
    {
        date = -1;
        return -1;
    }
    LinkStack*p = (LinkStack*)malloc(sizeof(LinkStack));
    p = top->next;
    date = p->elem_date.date;
    top->next = p->next;
    free(p);
    return 0;
}

//獲得棧頂元素
int get(LinkStack *top, int &date)
{
    if (top->next == NULL)
    {
        date = -1;
        return -1;
    }
    date = top->next->elem_date.date;
    return 0;
}

//判空
int empty(LinkStack *top)
{
    if (top->next == NULL)
    {
        return 1;
    }
    return 0;
}
//() {} []
//01 23 45
bool mate(char *buf)
{

    LinkStack *stack;
    Init(&stack);

    int buf1[MAX] = {};
    int i = 0;
    while (i<strlen(buf))
    {
        switch (buf[i])
        {
        case '(':buf1[i] = 0; break;
        case ')':buf1[i] = 1; break;
        case '{':buf1[i] = 2; break;
        case '}':buf1[i] = 3; break;
        case '[':buf1[i] = 4; break;
        case ']':buf1[i] = 5; break;
        default:
            break;
        }
        i++;
    }
    buf1[i] = 6;
    i = 0;
    int tmp = 0;
    while (buf1[i] != 6)
    {
        switch (buf1[i])
        {
        case 0:push(stack, buf1[i]); break;
        case 2:push(stack, buf1[i]); break;
        case 4:push(stack, buf1[i]); break;
        default:
            break;
        }
        switch (buf1[i])
        {
        case 1:
            {
                pop(stack, tmp);
                if (tmp != 0)
                {
                    return false;
                }
            }
            break;
        case 3:
        {
            pop(stack,tmp);
            if (tmp != 2)
            {
                return false;
            }
            break;
        }
        case 5:
        {
            pop(stack,tmp);
            if (tmp != 4)
            {
                return false;
            }
            break;
        }
        default:break;

        }
        i++;
    }
    if (empty(stack))
    {
        return true;
    }
    return false;

}

int main(void)
{
    char buf[MAX] = "";

    gets_s(buf);

    if (mate(buf))
        printf("括號可以匹配\n");
    else
        printf("括號不可以匹配\n");


    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章