问题描述:
试写一个判别表达式中开,闭括号是否配对出现的算法
问题分析:
这道题很简单,表达式存入数组中,判断,开,闭括号的个数相等,但是也要注意顺序,你不能出现这样的情况(【)】这个就不是正确的表达式了,也就是说两个匹配的操作符之间不能有其他的操作符。想到昨天做的简答题,把运算符入栈再去判断。
Int main()
{
Stack s;
initStack s;
Char buffer[30];
Int i;
Char x,y;
Scanf(“%s”,buffer);
While(buffer[i])
{
If(buffer[i]==’(’||buffer[i]==’[’||buffer[i]==’)’||buffer[i]==’]’)
Push(s,buffer[i]);
I++;
}
While(!stackempty(s))//怎样使栈后移,还是遇到坎了。所以这里的思路出现问题。。
(是还没有很理解,出栈的算法和判断栈为空的算法把,理解了,就明白,怎样用了,现在了解了点)
{
Pop(s,x);
if(x=’(’)
{
Pop(s,y);
If(y==’)’)
Printf(“”)
}
书上的算法:
BOOL BracketCorrespondency(char a[])
{
Int i=0;
Stack s;
InitStack(s);
ElemType x;
While(a[i]){
Switch(a[i]){
Case ‘(’:
Push(s, a[i]);
Break;
Case ‘[’:
Push(s, a[i]);
Break;
Case ‘)’:
GetTop(s, x);
If(x==’(’)
Pop(s,x);
Else return false;
Break;
Case’ ]’:
GetTop(s,x);
If(x==’[’)
Pop(s,x);
Else return false;
Break;
Default:
Break;
}
I++;
}
If(s.size!=0)
Return false;
Return true;
}
这个算法很好地解决了这个运算符匹配的问题。