这个抽象算法早已为人所知,只不过在VB的公开文档中鲜见示例代码。于是,为了提高自己的程序设计水平,锻炼自己的能力,我写了如下代码。

【VB代码版权所有,允许转载修改用作学习目的,转载必须注明来源

【求大家看完后留言啊!】

堆栈类的实现:

 1 Private Stack() As String
 2 Private itemCount As Long
 3 Private Sub Class_Initialize()
 4     ReDim Stack(0)
 5     Stack(0) = "#"
 6 End Sub
 7 Public Sub Push(ByVal inString As String)
 8     ReDim Preserve Stack(itemCount + 1)
 9     Stack(itemCount + 1) = inString
10     itemCount = itemCount + 1
11 End Sub
12
13 Public Function Pop() As String
14     If itemCount >= 1 Then
15         Pop = Stack(itemCount)
16         ReDim Preserve Stack(itemCount - 1)
17         itemCount = itemCount - 1
18     Else
19         Pop = ""
20     End If
21 End Function
22 Public Function Peek() As String
23     If itemCount = 0 Then
24         Peek = ""
25         Exit Function
26     End If
27     Peek = Stack(itemCount)
28 End Function
29
30 Sub Clear()
31     itemCount = 0
32     ReDim Stack(itemCount)
33     Stack(itemCount) = "#"
34 End Sub
35
36 Public Function Count()
37     Count = itemCount
38 End Function
39 Public Function ViewStack() As String
40     Dim kOut As String
41     Dim i As Long
42     If itemCount = 0 Then ViewStack = "": Exit Function
43     For i = 1 To itemCount
44         kOut = kOut & Format(i, "00") & " " & Stack(i) & vbCrLf
45     Next i
46     ViewStack = kOut
47 End Function

计算模块中的代码:

  1 Public opNum As New StackClass
  2 Public opChar As New StackClass
  3 Public Function CalcString(ByVal strIn As String) As String
  4     Dim sTxt As String
  5     Dim strNumFix As String
  6     Dim curChar As String
  7     Dim i As Long
  8     Dim signCount As Long
  9     Dim ops1 As String, ops2 As String, opC As String
 10     '初始化堆栈
 11         opNum.Clear
 12         opChar.Clear
 13     '堆栈初始化结束
 14     sTxt = strIn
 15     For i = 1 To Len(sTxt)
 16         curChar = Mid(sTxt, i, 1)
 17         If IsSymbol(curChar) = True Then
 18             '看看数字预备区有没有
 19             If strNumFix <> "" Then
 20                 opNum.Push strNumFix
 21                 strNumFix = ""
 22             End If
 23 redo:
 24             If IsHigh(curChar, opChar.Peek) = 1 Then 'if new come char is higher then push it to stack
 25                 opChar.Push curChar '如果等级高的控制符,则进入
 26                 signCount = signCount + 1
 27             ElseIf IsHigh(curChar, opChar.Peek) = 0 Then
 28                 If curChar = "#" And opChar.Peek = "#" Then
 29                     opChar.Pop
 30                     CalcString = opNum.Pop
 31                     Exit Function
 32                 End If
 33             ElseIf IsHigh(curChar, opChar.Peek) = -1 Then 'if low then ready to calculate
 34                 '判断是不是第一个符号
 35                 If signCount = 1 Then '这个符号是刚刚输入#后的那个,无论如何入栈
 36                     opChar.Push curChar
 37                     signCount = signCount + 1
 38                     GoTo nextone
 39                 End If
 40                 ops2 = opNum.Pop
 41                 ops1 = opNum.Pop
 42                 opC = opChar.Pop
 43                 opNum.Push CStr(Calc(ops1, ops2, opC))
 44                 If curChar = ")" And opChar.Peek = "(" Then
 45                     opChar.Pop  '如果操作数是),就把(弹出来
 46                     GoTo moveon
 47                 End If
 48                 GoTo redo
 49 moveon:
 50             End If
 51         Else '非符号
 52             strNumFix = strNumFix & curChar
 53         End If
 54 nextone:
 55     Next i
 56 End Function
 57
 58 Public Function Calc(ByVal op1 As String, ByVal op2 As String, ByVal options As String) As Double
 59 On Error Resume Next
 60 Calc = 0
 61 Select Case options
 62     Case "+"
 63         Calc = CDbl(op1) + CDbl(op2)
 64     Case "-"
 65         Calc = CDbl(op1) - CDbl(op2)
 66     Case "*"
 67         Calc = CDbl(op1) * CDbl(op2)
 68     Case "/"
 69         Calc = CDbl(op1) / CDbl(op2)
 70 End Select
 71 End Function
 72
 73 Public Function IsHigh(ByVal sNew As String, ByVal sOld As String) As Integer
 74 '1大于,-1小于,0等于
 75 Select Case sNew
 76 Case "+"
 77     Select Case sOld
 78         Case "("
 79             IsHigh = 1
 80             Exit Function
 81         Case "#"
 82             IsHigh = 1
 83             Exit Function
 84         Case Else
 85             IsHigh = -1
 86             Exit Function
 87     End Select
 88 Case "-"
 89     Select Case sOld
 90         Case "("
 91             IsHigh = 1
 92             Exit Function
 93         Case "#"
 94             IsHigh = 1
 95             Exit Function
 96         Case Else
 97             IsHigh = -1
 98             Exit Function
 99     End Select
100 Case "*"
101     Select Case sOld
102         Case "("
103             IsHigh = 1
104             Exit Function
105         Case "#"
106             IsHigh = 1
107             Exit Function
108         Case "+"
109             IsHigh = 1
110             Exit Function
111         Case "-"
112             IsHigh = 1
113             Exit Function
114         Case Else
115             IsHigh = -1
116             Exit Function
117     End Select
118 Case "/"
119     Select Case sOld
120         Case "("
121             IsHigh = 1
122             Exit Function
123         Case "#"
124             IsHigh = 1
125             Exit Function
126         Case "+"
127             IsHigh = 1
128             Exit Function
129         Case "-"
130             IsHigh = 1
131             Exit Function
132         Case Else
133             IsHigh = -1
134             Exit Function
135     End Select
136 Case "("
137     Select Case sOld
138         Case "+"
139             IsHigh = 1
140             Exit Function
141         Case "-"
142             IsHigh = 1
143             Exit Function
144         Case "*"
145             IsHigh = 1
146             Exit Function
147         Case "/"
148             IsHigh = 1
149             Exit Function
150         Case "("
151             IsHigh = 1
152             Exit Function
153         Case Else
154             IsHigh = -1
155             Exit Function
156     End Select
157 Case ")"
158     IsHigh = -1
159     Exit Function
160 Case ""
161     IsHigh = -1
162     Exit Function
163 Case "#"
164     Select Case sOld
165         Case "#"
166             IsHigh = 0
167             Exit Function
168         Case ""
169             IsHigh = 1
170             Exit Function
171         Case "+"
172             IsHigh = -1
173             Exit Function
174         Case "-"
175             IsHigh = -1
176             Exit Function
177         Case "*"
178             IsHigh = -1
179             Exit Function
180         Case "/"
181             IsHigh = -1
182             Exit Function
183         Case ")"
184             IsHigh = -1
185             Exit Function
186     End Select
187 End Select
188 End Function
189
190 Public Function IsSymbol(ByVal strS As String) As Boolean
191     IsSymbol = True
192     Select Case strS
193         Case "+"
194         Case "-"
195         Case "*"
196         Case "/"
197         Case "("
198         Case ")"
199         Case "#"
200         Case Else
201             IsSymbol = False
202     End Select
203 End Function

转载于:https://www.cnblogs.com/sunsoftresearch/archive/2013/04/23/3037271.html

【原创】VB利用堆栈实现算术表达式计算相关推荐

  1. 利用树求解算术表达式的值

    利用树求解算术表达式的值 #include <stdio.h> #include <string.h> #include <malloc.h> //#include ...

  2. java算术表达式_一文了解如何用 Java 进行算术表达式计算

    (给ImportNew加星标,提高Java技能) 编译:ImportNew/唐尤华 如何用Java计算"5+3"."10-40"."10*3" ...

  3. 简单的用堆栈实现的表达式计算

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  4. [算法 笔记]字符串表达式计算(简易版)

    题目:编写一个函数,计算字符串中表达式的值,参数中只包含计算符:+,-,*,/等.例如,str="10+50+2*6/3",result=64. 解析: 考虑算术表达式计算规则: ...

  5. 【数据结构】栈的应用-算术表达式求值#数据结构实验任务书

    实验题目:栈的应用-算术表达式求值 正文 实验环境: Visual C++ 2010 实验目的: 1.掌握栈的定义及实现: 2.掌握利用栈求解算术表达式的方法. 实验内容: 通过修改完善教材中的算法3 ...

  6. 算术表达式求值的程序设计与实现_数据结构课程设计

    以下内容可且仅可供参考,如有错误欢迎指正. 部分思路借鉴算术表达式求值(C语言栈)_夜何其的博客-CSDN博客_c语言利用栈求解算术表达式侵删致歉 <算术表达式求值的程序设计与实现>题目要 ...

  7. java利用栈求复杂表达式_java中的栈Stack的基本使用和应用(二) ——利用栈计算合法的算术表达,中缀表达式转后缀表达式...

    利用栈Stack计算合法的算术表达式 限定的算术表达式求值问题:包含 "+"."-"."*"."/" .正整数和圆括号的 ...

  8. 异常:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值...

    在一般处理程序中执行 context.Response.End()方法会报出:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"这个异常. 对于这个异常微软有解 ...

  9. html算术计算,js实现计算器 提供算术表达式求值

    //html 计算器 @import "calculator.css"; //CSS /* CSS Document */ body { /*   padding-right:40 ...

最新文章

  1. 解题报告:luoguP6685 可持久化动态仙人掌的直径问题
  2. 分析windows宿主机Ping不通linux虚拟机的其中一种情况
  3. java8新特性(7)— Base64
  4. 又翻车?苹果被揪出夸大iPhone续航时间:iPhone XR虚标51%
  5. java21天打卡-day2
  6. H3C交换机配置STP配置
  7. MATLAB图像去雾霭算法及其实现
  8. 从录屏到转换为GIF的一站式解决方案
  9. html视频怎么添加封面,快影视频封面怎么添加文字标题
  10. 【每周一文】Supervised Sequence Labelling with Recurrent Neural Networks
  11. 福利贴——爬取美女图片的Java爬虫小程序代码
  12. android 删除垃圾文件夹,Android手机里的垃圾文件和文件夹清理
  13. 梦想家-致停不下来的我们
  14. dojo学习日记(6)——dojo/_base/fx的 fadeOut()方法
  15. 涉及的无盘网络技术方面问题的解答(转)
  16. C语言实现,古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
  17. 浅谈一下汽车行业中的OTA/FOTA/SOTA
  18. 100Mhz秒脉冲发生器 vivado
  19. 【学习挑战赛】经典算法之折半查找
  20. Docker系列(1-简介篇) -- 为什么要使用docker?

热门文章

  1. 无线路由器与无线AP的区别
  2. QQ爬虫-爬取QQ空间
  3. 如何将DynamoDB的数据增量迁移到表格存储
  4. (转)关于数据库主键和外键(终于弄懂啦)
  5. 知方可补不足~开发人员可以自己定义VS文件模版
  6. Linux系统中的Page cache和Buffer cache
  7. 记一次大规模数据迁移和加密
  8. AC日记——小书童——刷题大军 洛谷 P1926
  9. 计算机一级ps2019,2019年计算机一级考试PS基础学习点子:PS菜单中英文对照表.docx...
  10. php 依赖注入框架,通过实现依赖注入和路由,构建一个自己的现代化PHP框架