栈(stack)-栈实现简单计算器

使用栈来实现综合计算器-自定义优先级[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()) 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值