假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”、方括号“[”和“]”和花括号“{”和“}”,

假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”、方括号“[”和“]”和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。

第1个回答  2010-10-25
1.建 个 堆栈,遇到( [ {就压栈,遇到) ] } 就看现在 栈顶里 放的跟遇到的是不是匹 配。是,出 栈,不是,报错。

2.如果遇到) ] } 栈为空,报错

3.所有输入完成时栈不为空,报错

const
ok='OK';
wrong='Wrong';
ans:array[false..true]of string=(wrong,ok);
zuo=['[','('];you=[')',']'];
var
s:string;
i,j,k,n_b,n_e,m_b,m_e,top,zz:integer;
a:array[1..10]of char;
function zhankong:boolean;
begin
exit(top=0);
end;
function chuzhan:char;
begin
dec(top);
exit(a[top+1]);
end;

procedure jinzhan(c:char);
begin
inc(top);a[top]:=c;
end;

function jishuan:boolean;
var
c:char;
begin

repeat
if s[zz]in zuo then jinzhan(s[zz]);
if (s[zz]in you) and zhankong then exit(false);

if s[zz]in you then
begin c:=chuzhan;
if ((c='(')and(s[zz]=')'))or((c='[')and(s[zz]=']'))
then zz:=zz else exit(false);
end;
inc(zz);
until (zhankong)or(zz=length(s)+1);
if not( zhankong) then if not(zz=length(s)+1) then exit(false);
exit(true);
end;

begin
readln(s);
n_b:=0;
n_e:=0;
m_b:=0;
m_e:=0;
for i:=1 to length(s) do
case s[i] of
'(':inc(n_b);
')':inc(n_e);
'[':inc(m_b);
']':inc(m_e);
end;
if (n_b<>n_e)or(m_b<>m_e) then begin writeln(wrong);halt; end;
top:=0;zz:=1;
writeln(ans[jishuan]);
end.

参考资料:自己编的

本回答被网友采纳
相似回答