27,581
社区成员




declare @s varchar(8000),@next int
set @s=')((()as(d(s())))'
declare @ntb table(id int ,name varchar(10),next int)
declare @stb table(id int identity(1,1),name varchar(10))
set @next=1
/*模拟循环链表*/
while (@s is not null)
begin
insert into @ntb values(@next,left(@s,1),@next+1)
select @s=stuff(@s,1,1,''),@next=@next+1
end
update @ntb
set next=1
where id=@next-1
select * from @ntb
/*模拟栈并进行判断*/
declare @nextNode int,@c char ,@id int
select top 1 @id=id,@c=name,@nextnode=next from @ntb order by id
while @nextnode<>(select min(id) from @ntb)
begin
if @c='('
begin
insert into @stb values(@c)
end
if @c=')'
begin
if exists(select 1 from @stb)
begin
delete from @stb
where id=(select max(id) from @stb)
end
else
break
end
select @id=id,@c=name ,@nextnode=next from @ntb where id=@nextnode
end
if exists(select 1 from @stb)
print'左括号不匹配'
else
if exists(select 1 from @ntb where id>@id )
print '右括号不匹配'
else
print '匹配'
结果:
右括号不匹配