题目描述:
输入一串字符串,其中有普通的字符与括号组成:包括‘(’‘)’‘[’ ']',要求验证括号是否匹配,如果匹配则输出0,否则输出1.
题目思路: 严蔚敏数据结构书上49页有写,可以模拟栈的操作。检验括号是否匹配的方法用期待的急迫程度来描述。
[ ( [ ] [ ] ) ]
当计算机接受了第一个括号后,它期待着与其匹配的第8个括号的出现,然而等来的确实第2个括号,此时第一个括号[ 只能靠边,而迫切等待与第2个括号相匹配的。。。依次类推。
这个处理过程与栈的特点相吻合,由此,在算法中设一个栈,每读入一个括号,若是右括号,则或者使置于栈顶的最急迫的期待得以消解,或者是不合法的情况。若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原来的在栈中的所有未消解的期待的急迫性都降了一级。本题只是假如个其他字符。
#include<iostream>
using namespace std;
#define m 20
typedef char ElemType;
typedef struct stacknode
{
ElemType stack[m];
int top;
}stacknode;
stacknode *sp;
//初始化一个栈
void Init(stacknode *st)
{
st->top = 0;
}
//push操作
void Push(stacknode *st,ElemType x)
{
if(st->top == m)
cout<<"The stack is overflow"<<endl;
else
{
st->stack[st->top] = x;
(st->top)++;
}
}
void Pop(stacknode *str,ElemType &e)
{
(str->top)--;
e = str->stack[str->top];
}
bool Panduan(char *s)
{
sp = (stacknode*)malloc(sizeof(stacknode));
Init(sp);
char e;
for(int i = 0;i<strlen(s);i++)
{
if(s[i]!=']'&&s[i]!= ')')
Push(sp,s[i]);
else if(s[i] == ']')
{
Pop(sp,e);
while(e!='['&&e!= '(')
{
Pop(sp,e);
}
if(e == '(')
{
return false;
}
}
else if(s[i] == ')')
{
Pop(sp,e);
while(e!='['&&e!= '(')
{
Pop(sp,e);
}
if(e == '[')
{
return false;
}
}
}
if(sp->top == 0)
return 1;
else
return 0;
}
int main()
{
char s[m];
while(gets(s))
{
cout<<Panduan(s)<<endl;
}
system("pause");
return 0;
}