作业帮 > 综合 > 作业

pascal括号匹配检查的程序,用栈的(最好有解释)

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/04 10:40:44
pascal括号匹配检查的程序,用栈的(最好有解释)
一个只由大括号{},中括号[],小括号()组成的字符串,其嵌套次序只能是:大括号可以嵌套中小括号,中括号可以嵌套小括号.现给出n个这样的字符串(每行一个字符串,字符串中无空格),判断其是否正确匹配,若匹配,该行输出“YES”,否则该行输出“NO”(YES和NO均为大写字符,输出时不要输出引号).
如下是正确匹配样例:
{[()]()[()]}
()()[()]{[()]}
()[()]
{()()[]}
以下不匹配样例:
([]) 注:中括号置于小括号中
[()(] 注:括号不成对
Input
  第一行,n值(小于10).
  接下来n行,每行一个字符串,每个字符串的长度均不超过250个字符.
Output
  n行,每行为“YES”或“NO”,以判断对应行是否匹配.
Sample Input
6 //n为6,表示有6个字符串待检测
{[() ]()[() ]} //以下为6个字符串,每行一个
( )( ) [()]{[()]}
([])
[()(]
()[()]
{()()[ ] }
Sample Output
YES
YES
NO
NO
YES
YES
program bracket;
const
a:array['a'..'d']of byte=(1,2,3,0);
var
n,t,i,j:longint;
p:boolean;
s:string;
c:array[0..255]of char;
procedure pop;
begin
dec(t);
end;
procedure push(x:char);
begin
inc(t);
c[t]:=x;
end;
begin
readln(n);
for i:=1 to n do
begin
readln(s);
c[0]:='d';
t:=0;
p:=true;
for j:=1 to length(s) do
case s[j] of
'{':s[j]:='a';
'[':s[j]:='b';
'(':s[j]:='c';
end;
while length(s)0 do
begin
case s[1] of
'}':if c[t]='a' then pop else begin p:=false; break; end;
']':if c[t]='b' then pop else begin p:=false; break; end;
')':if c[t]='c' then pop else begin p:=false; break; end;
else if a[c[t]]