先说明,在计算算数表达式的值时,可用两个栈作为辅助工具。
假设一个算术表达式中包含三种括号,圆括号(,方括号【,和花括号{
编写算法判断给定表达式中所含括号是否配对出现。
分析:可以将给定表达式存入字符数组a[],然后依次考察每个字符。如果为左括号,则将其入栈,如果为右括号
则将其与站定元素比较,若配对了一对括号,则将栈顶元素出栈,若不匹配,则退出算法并返回不匹配结果。
对每个字符考查完毕,若栈为空,则说明括号配对,否则,说明缺少左括号或右括号。
算法只考查左右括号,对其他字符不做处理。
int prool(char a[],int n)
{
top=-1;i=0;flag=1;//假设采用顺序栈,flag为配对标志
while(i<n&&flag)
{
if(a[i]=='(' || a[i]=='{' || a[i]=='[') s[++top]=a[i] ;
else
{
switch a[i]
{
case ')' if(top==-1||s[top--]!='(') {flag=0; break;}
case '}' if(top==-1||s[top--]!='}’) {flag=0; break;}
case '[' if(top==-1||s[top--]!=']') {flag=0; break;}
}
}
i++;
}
if(top!=-1) flag=0; //栈不为空,说明括号不匹配
return flag;
}
java的写法
int prool(char a[],int n)
{
Stack stack = new Stack();
i=0;flag=1;//假设采用顺序栈,flag为配对标志
while(i<n&&flag)
{
if(a[i]=='(' || a[i]=='{' || a[i]=='[') stack.push(a[i]) ;
else
{
switch a[i]
{
case ')' if(stack.empty()||stack.pop()!='(') {flag=0; break;}
case '}' if(stack.empty()||stack.pop()!='}’) {flag=0; break;}
case '[' if(stack.empty()||stack.pop()!=']') {flag=0; break;}
}
}
i++;
}
if(!stack.empty()) flag=0; //栈不为空,说明括号不匹配
return flag;
}