【算法步骤】
① 初始化一个空栈S。
② 设置一标记性变量flag,用来记录左括号(“(”或“[”)的数量,flag初值为0。
③ 扫描表达式,依次读入字符ch,以“#”为结束字符,如果表达式没有扫描完毕或flag非零,则循环执行以下操作:
l
若
ch
是左括号“
[”
或“
(”
,则将其压入栈,flag++;
l
若
ch
是右括号“
)”
,则根据当前栈顶元素的值分情况考虑:若栈非空且栈顶元素是“
(”
,则正确匹配,flag--,否则错误匹配,输出“error”,结束程序
;
l
若
ch
是右括号“
]”
,则根据当前栈顶元素的值分情况考虑:若栈非空且栈顶元素是“
[”
,则正确匹配,flag--,否则错误匹配,输出“error”,结束程序
。
④ 退出循环后,如果栈空且flag值为0,则匹配成功并输出“correct”。
#include <iostream>
using 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";
return 0;
}
|