1. 程式人生 > >表示式括號匹配

表示式括號匹配

Description
假設一個算術表示式中可以包含三種括號:圓括號“( ”和“ )”、方括號“ [ ”和“ ] ”和花括號“{”和“}”,且這三種括號可按任意的次序巢狀使用(如:…[…{…}…[…]…]…[…]…(…)…)。編寫判別給定表示式中所含括號是否正確配對出現的程式(已知表示式已存入資料元素為字元的順序表中)。

Input
輸入算術表示式,換行結束。

Output
若給定表示式中所含括號正確配對,則輸出yes,否則輸出no。

Sample Input
[5+(6-3)]-(2+3)]

Sample Output
no

用到iostream,stdio.h,stdlib.h
using namespace std;

typedef struct tagNODE
{
char date;
struct tagNODE *pre;
struct tagNODE *next;
}Lnode,*Linklist;

void push(Linklist *,char);
int check(Linklist,Linklist *,char);

int main()
{
Linklist head,top;//存放括號的連結串列,分別是頭結點和棧頂的結點
top=head=(Linklist)malloc(sizeof(Lnode));

int flag=1;//flag用來標記匹配成功與否,如果失敗則為0,成功則為1 

char c;//抽取!
c=getchar();
while(c!='\n'&&flag==1)
{
    if(c=='('||c=='['||c=='{')
    {
        push(&top,c);
        top=top->next;
    }

    else if(c==')'||c==']'||c=='}')
    {
        flag=check(head,&top,c);
    }
    c=getchar();
}

if(top!=head)//如果,檢查完了所有輸入後,棧不為空,則匹配失敗!棧為空,則匹配成功 
{
    flag=0;
}

if(flag==0)
{
    cout<<"no"<<endl;
}
else
{
    cout<<"yes"<<endl;
}

}

void push(Linklist *l,char sym)
{
Linklist s,p=(*l);
s=(Linklist)malloc(sizeof(Lnode));

s->date=sym;
s->next=NULL;
s->pre=p;
p->next=s;

}

int check(Linklist head,Linklist *l,char sym)
{
Linklist q,p=(*l);

if(p==head)//判斷棧是否為空 
{
    return 0;
}

else
{
    if(sym==')')
    {
        if(p->date!='(')
        {
            return 0;
        }
        else
        {
            (*l)=(*l)->pre;//top向回彈一個!
            p->pre->next=NULL;//top出棧!
            free(p);
            return 1;
        }
    }

    if(sym==']')
    {
        if(p->date!='[')
        {
            return 0;
        }
        else
        {
            (*l)=(*l)->pre;
            p->pre->next=NULL;
            free(p);
            return 1;
        }
    }

    if(sym=='}')
    {
        if(p->date!='{')
        {
            return 0;
        }
        else
        {
            (*l)=(*l)->pre;
            p->pre->next=NULL;
            free(p);
            return 1;
        }
    }
}

}