使用栈来实现综合计算器-自定义优先级[priority]
expression =”3+2*6-2” = 13
思路
- 1)设计两个栈,一个存数值【数栈】,一个存符号【符号栈】。
- 2)对expression进行扫描,一个一个取出。
- 3)当取出的字符是数时,就直接入数栈。
- 4)当取出的字符时符号时:
- 4.1)如果当前符号栈没有数据,就直接入栈。
- 4.2)如果当前符号的优先级小于等于符号栈的栈顶的符号的优先级,则取出该符号,并从数栈依次pop两个数据进行运算,将结果重新push到数栈,再将当前符号push到符号栈。
- 4.3)如果当前符号的优先级大于符号栈的栈顶的符号的优先级,符号直接入符号栈。
- 5)当整个表达式扫描完毕后,依次从数栈和符号栈取出数据进行运算,最后在数栈中的数据就是结果。
代码实现
package chapter18.stack
import util.control.Breaks._
// 考虑对表达式加入()。
object Calculator {
def main(args: Array[String]): Unit = {
// val expression = "3101+4*6-2"
val expression = "7*2*2-5+1-5+3-4"
val numstack = new ArrayStack2(10) //数字栈
val operStack = new ArrayStack2(10) //符号栈
/*
思路:
1)设计两个栈,一个存数值【数栈】,一个存符号【符号栈】。
2)对expression进行扫描,一个一个取出。
3)当取出的字符是数时,就直接入数栈。
4)当取出的字符时符号时:
4.1)如果当前符号栈没有数据,就直接入栈。
4.2)如果当前符号的优先级小于等于符号栈的栈顶的符号的优先级,则取出该符号,并从数栈依次pop两个数据进行运算,将结果重新push到数栈,再将当前符号push到符号栈。
4.3)如果当前符号的优先级大于符号栈的栈顶的符号的优先级,符号直接入符号栈。
5)当整个表达式扫描完毕后,依次从数栈和符号栈取出数据进行运算,最后在数栈中的数据就是结果。
*/
var index = 0 //表达式数组下标
var num1 = 0 //第一个操作数
var num2 = 0 //第二个操作数
var oper = 0 //操作符
var res = 0 //运算结果
var ch = ' ' //存储从表达中取出的字符
var keepNum = "" //在进行扫描时,保存上次的数字ch,并进行拼接。
breakable {
//循环取出expression中的字符
while (true) {
//扫描
ch = expression.substring(index, index + 1)(0)
if (operStack.isOper(ch)) {
//如果是操作符
if (!operStack.isEmpty())