• 中缀算术转后缀算术表达式并计算的函数


    --创建函数(原创:cson_cson)

    create function dbo.js(@bds varchar(1000))

    returns float

    as

    begin

    declare @i int,@j int

    declare @c1 char(1),@c2 char(1),@c varchar(100)

    declare @v1 float,@v2 float,@v float

    declare  @t table(id int identity(1,1),s varchar(100))

    declare  @s table(id int identity(1,1),s varchar(100))

    declare  @sv table(id int identity(1,1),v float)

     

    select @i = 0,@j = len(@bds),@c2 = '',@c = ''

    while @i<@j

    begin

     select @c1 = @c2,@i = @i+1

     select @c2 = substring(@bds,@i,1)

    if charindex(@c2,'.0123456789') > 0 or (@c2 = '-' and @c1 in('','*','-','+','/','('))

     begin   select @c = @c + @c2   continue  end

     if @c <> ''  begin insert @t(s)  select @c select @c = '' end

     if charindex(@c2,')')>0

     begin

       insert @t(s)  select s from @s where id > isnull((select max(id) from @s where s in('(')),0) order by id desc

       delete @s where id >= isnull((select max(id) from @s where s in('(')),0)

       continue

     end

     if charindex(@c2,'+-)')>0

     begin

       insert @t(s)  select s from @s where id > isnull((select max(id) from @s where s in('(')),0) order by id desc

       delete @s where id > isnull((select max(id) from @s where s in('(')),0)

       if @c2 <> ')' insert @s(s) select @c2

       continue

     end

     if charindex(@c2,'*/')>0

     begin

       insert @t(s)  select s from @s where id > isnull((select max(id) from @s where s in('(','+','-')),0) order by iddesc

       delete @s where id > isnull((select max(id) from @s where s in('(','+','-')),0)

       insert  @s select @c2

       continue

     end

     if charindex(@c2,'(')>0 insert  @s select @c2

    end

    if @c <> '' insert @t(s) select @c

    insert @t(s)  select s from @s order by id desc

    select @i = 0,@j = max(id) from @t

    while @i < @j

    begin

     select @i = @i + 1

     select @c = s from @t where id = @i

     if @c = '(' continue

     if @c not in('*','-','+','/')  begin  insert @sv(v) select convert(float,@c) continue end

     select @v2 = v from @sv  delete @sv  where id = (select max(id) from @sv)

     select @v1 = v from @sv  delete @sv  where id = (select max(id) from @sv)

     select @v = case @c when '+' then @v1 + @v2 when '-' then @v1 - @v2

                         when '*' then @v1 * @v2 when '/' then @v1 / @v2 end

     insert @sv(v) select @v

    end

    select @v = v from @sv

    return @v

    end

     

    --测试示例

    declare @bds varchar(100)

    select @bds = '1+(2+3)*4-9'

    select dbo.js(@bds) as func

     

    --运行结果

    /*

    func

    ----------------------

    12

    */

  • 相关阅读:
    粘包_Server
    初见UDP_Server
    初见UDP_Client
    TCP/UDP协议
    网络编程相关概念
    mmap实现大文件快速拷贝
    生成这消费者问题(多线程实现)
    线程同步互斥实现资源访问
    信号灯(线程互斥)
    线程属性
  • 原文地址:https://www.cnblogs.com/accumulater/p/6244569.html
Copyright © 2020-2023  润新知