回 帖 发 新 帖 刷新版面

主题:关于 表达式的计算

以前看到过有人问到 诸如a+b*c+(d+e)/f 之类的表达式的计算,咱也提一个思路--逆波兰表示法,它要用到 堆栈 这样的数据结构

1。双目运算
如a+b ==> ab+   a-b ==> ab-    
  a*b ==> ab*   a/b ==> ab/

a+b*c+(d+e)/f ==> [a(bc*)+][(de+)f/]+ ==> abc*+de+f/+

2。单目运算
如 sin(a) ==> a sin

即数值在前,操作在后

栈 是一个一维的数据结构
参见:[url]http://www.fosu.edu.cn/gong/schoolweb/class/023142/news/2004-3-31/200433118453.htm[/url] 或 [url]http://www.rszx.net/jingsai/printpage.asp?ArticleID=83[/url]
我们可以用数组模拟堆栈的结构

To be continue...

回复列表 (共1个回复)

沙发

i$="3*6+4*5^3-48/12"

for i=len(i$) to 1 step -1
  if mid$(i$,i,1)=space$(1) then i$=left$(i$,i-1)+mid$(i$,i+1)
next

su$=""
for k=1 to len(i$)
   k$=mid$(i$,k,1)
   if instr(1,".0123456789", k$)then
      su$=su$+k$
      p=1
   elseif instr(1,"^+-*/\",k$)then
      if p=0 and k$="-" then
         su$=su$+k$
      else
         i=i+1
         f$(i)=k$
         n(i)=val(su$)
         su$=""
      endif
      p=0
   else
      print "算式中有其他非法字符"
   endif
next     
  i=i+1
  f$(i)="end"
  n(i)=val(su$)

if i>m then print "运算的个数超过了";m;"个,请重新修改程序"


do until i=1
   h=h+1
   if h>=i then exit do
   if yun(f$(h+1))<=yun(f$(h)) then
      n(h)=desu(n(h),f$(h),n(h+1))
      i=i-1
      for ii=h to (i-1)
          f$(ii)=f$(ii+1)
          n(ii+1)=n(ii+2)
      next
          f$(ii)=f$(ii+1)
      h=0
   end if
loop
print "运算结果是";n(1)
system

function yun(a$)
yun=(instr(1,"最后 +-   */\  ^    ",a$)+1)\5
'把运算符号分等级,每五个符号为一级吧,当然了,这随你喜欢去更改的
end function

function desu(a,b$,c)
select case b$
case "^"
  desu=a^c
case "*"
  desu=a*c
case "\"
  desu=a\c
case "/"
  desu=a/c
case "+"
  desu=a+c
case "-"
  desu=a-c
case else
''有其他运算规则照样加上去喽
end select
end function

我来回复

您尚未登录,请登录后再回复。点此登录或注册