【算法步骤】
① 初始化一个空栈S。
② 设置一标记性变量flag,用来记录左括号(“(”或“[”)的数量,flag初值为0。
③ 扫描表达式,依次读入字符ch,以“#”为结束字符,如果表达式没有扫描完毕或flag非零,则循环执行以下操作:
l 若 ch 是左括号“ [” 或“ (” ,则将其压入栈,flag++; l 若 ch 是右括号“ )” ,则根据当前栈顶元素的值分情况考虑:若栈非空且栈顶元素是“ (” ,则正确匹配,flag--,否则错误匹配,输出“error”,结束程序 ; l 若 ch 是右括号“ ]” ,则根据当前栈顶元素的值分情况考虑:若栈非空且栈顶元素是“ [” ,则正确匹配,flag--,否则错误匹配,输出“error”,结束程序 。④ 退出循环后,如果栈空且flag值为0,则匹配成功并输出“correct”,否则错误匹配,输出“error”,结束程序。
#includeusing namespace std; typedef struct StaticNode { char data; struct StaticNode *next; }StaticNode,*StaticPtr; int Init_Static(StaticPtr &S)//初始化 { S=NULL; } int En_Static(StaticPtr &S,char e)//入栈 { StaticPtr p; p=new StaticNode; p->data=e; p->next=S; S=p; } int De_Static(StaticPtr &S,char &e)//出栈 { if(S==NULL) exit(0); StaticPtr p; p=S; S=S->next; e=p->data; delete p; } int empty(StaticPtr &S)//判断链栈是否为空 { if(S==NULL) return 1; else return 0; } int main() { StaticPtr S; char str,str_1; int flag=0; cin >> str; Init_Static(S); En_Static(S,str); if(str=='('||str=='[') flag++; else { cout << "error"; exit(0); } while(str!='#') { cin >> str; if((str=='('||str=='[')) { En_Static(S,str); flag++; } else if(str==')'||str==']') { De_Static(S,str_1); if((str_1=='('&&str==']')||(str_1=='['&&str==')')) { cout << "error"; exit(0); } else { flag--; //cout << "correct" << endl; } } } if(flag==0) cout << "correct"; else cout << "error"; return 0; }



