表示式括號匹配
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; } } }
}