科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用sql模拟循环链表与堆栈进行括号匹配

使用sql模拟循环链表与堆栈进行括号匹配

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

使用sql模拟循环链表与堆栈进行括号匹配

作者:csdn 来源:csdn 2009年12月21日

关键字: MS-SQL Server 问答

  • 评论
  • 分享微博
  • 分享邮件

使用sql模拟循环链表与堆栈进行括号匹配

问题:设计一个算法,判断一个算术表达式中的括号是否配对。算术表达式保存在带头结点的单循环链表中,每个结点有两个域:ch和link,其中ch域为字符类型。

    如果单纯从用程序的角度来说,难度应该不大。我的看法:当遇到(号,那么计数器加1,当遇到右括号的时候,计数器减1.
结果及判断条件:
    1、匹配:计数器为0,字符串读取结束
    2、(不匹配:有多余的(导致不匹配,计数器不为0
    3、)不匹配,有多余的)导致不匹配,计数器为0,但是字符串中遇到)。

另外还有其他方法:

    参见:http://topic.csdn.net/u/20090620/17/bffdc5aa-d3dc-4001-bd98-6ad1ececc5bd.html 10楼。

  但是在这里要求使用链表和堆栈。

1、思路:根据括号的特点( ( ) ),进行匹配的时候,第一个做括号最后一个匹配,最后一个左括号与第一个右括号相匹配,恰好可以使用栈来进行存储。

2、方法:先把表达式放在链表中,然后读取链表,当遇见左括号时,把“(”入栈,遇见

  “)”时进行出栈,直到栈空或者链表结束。

3、在进行检测括号是否匹配的时候,需要考虑到各种情况:

    1)、匹配。 例如:(())

    2)、左括号不匹配。例如: (()

    3)、右括号不匹配。例如: ())

4、判断上述几种情况的方式:

    1)左括号不匹配:当链表读取结束的时候,检测栈为不为空。

    2)右括号不匹配:当栈为空,而链表中还存在“)”。

    3)括号匹配:当栈为空,并且读取链表结束。

    http://blog.csdn.net/HEROWANG/archive/2009/06/20/4285326.aspx
    在这里使用SQL来模拟循环链表和堆栈。使用链表的思路其实就是一个简单的BOM。另,在使用堆栈进行判断的时候,使用游标来读取表中的内容更简单一点,但是在这里为了更好的体现链表的特点,所以使用的是next来获取下一个字符。
    SQL codedeclare @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 '匹配'    
结果:  
右括号不匹配 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/HEROWANG/archive/2009/07/04/4321071.aspx


    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章