首页 > 其他分享 >计算四则表达式值 Golang

计算四则表达式值 Golang

时间:2022-08-27 19:12:18浏览次数:42  
标签:return exp ss res len else Golang 计算 表达式

思路:
先转逆波兰,再求值

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func mid2fix(s string) []string {
	res := []string{}
	exp := strings.Fields(s)
	ss := []string{}
	fmt.Println(exp)

	for _, c := range exp {
		_, err := strconv.Atoi(c)
		// 是数字 结果直接加
		if err == nil {
			res = append(res, c)
		} else {
			// 不是数字 
			if len(ss) == 0 {
				// 栈空直接入
				ss = append(ss, c)
			} else {
				// 判断优先级是否低于栈顶
				lst := ss[len(ss)-1]
				if low_prio(c, lst) {
					for len(ss) > 0 {
						res = append(res, ss[len(ss)-1])
						ss = ss[:len(ss)-1]
					}
				}
				ss = append(ss, c)
			}
		}
	}
	for len(ss) > 0 {
		res = append(res, ss[len(ss)-1])
		ss = ss[:len(ss)-1]
	}
	return res
}

func low_prio(a, b string) bool {
	if a == "*" || a == "/" {
		return false
	} else {
		if b == "*" || b == "/" {
			return true
		} else {
			return false
		}
	}
}

func calc_res(exp []string) int {
	s := []int{}
	for _, ex := range exp {
		num, err := strconv.Atoi(ex)
		if err == nil {
			s = append(s, num)
		} else {
			a, b := s[len(s)-2], s[len(s)-1]
			s = s[:len(s)-2]
			s = append(s, op(a, b, ex))
		}
	}
	return s[0]
}

func op(a, b int, c string) int {
	if c == "*" {
		return a * b
	} else if c == "/" {
		return a / b
	} else if c == "+" {
		return a + b
	} else {
		return a - b
	}

}
func main() {
	tt := "2 + 3 * 4 - 5 / 6"
	exp := mid2fix(tt)
	fmt.Println(exp)
	res := calc_res(exp)
	fmt.Println(res)
}

标签:return,exp,ss,res,len,else,Golang,计算,表达式
From: https://www.cnblogs.com/notomatoes/p/16631244.html

相关文章

  • 计算机网络基础一
    WAN和LANWAN:wideareanetwork,广域网。一般运营商的网络就叫做广域网LAN:localareanetwork,局域网。网络协议:网络设备之间互相通信的约定(语言),以前不同的厂商使用......
  • [Golang] cgo 调用 .so 捕获异常问题
    最近需要在go中去调用.so库去完成一些事情,go方面,利用cgo可以顺利的调用.so中的方法,但是有个问题是go没法捕获.so那边出现的异常。如果.so那边异常了,那么会......
  • 按日期段计算平均销量
    问题:某个产品近3天、近7天、近30天各自的日均销量解决:近3天:{=AVERAGE(IF(NOW()-A2:A28<3,B2:B28))}近7天:{=AVERAGE(IF((NOW()-A2:A28<7)*(NOW()-A2:A28>=3),B2:B28))}......
  • 计算机网路的基础知识
    一.由于javaweb简单的面试题引申出的计算机网络的基础知识谈谈网站是如何进行访问的1.输入一个域名enter2.检查本机的C:\Windows\System32\drivers\etc\下的配置文件中......
  • MapReduce计算流程
    MapReduce的计算流程1.1原始数据FileThebookschronicletheadventuresoftheadolescentwizardHarryPotterandhisbestfriendsRonWeasleyandHermioneGra......
  • Lambda表达式
    作用简化匿名内部类的代码写法格式(匿名内部类被重写方法的形参列表)->{被重写方法的方法体代码}注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式......
  • C#验证邮箱格式正则表达式
    1///<summary>2///验证邮箱格式3///</summary>4///<paramname="email"></param>5///<returns></returns>6......
  • LeetCode 150. 逆波兰表达式求值
    思路:当字符串为运算符号是弹出栈中两个数字进行运算stoi("1")将string转换为intclassSolution{public:intevalRPN(vector<string>&tokens){stack<......
  • MySQL second_behind_master计算方式
    对于主从库主机时间不一致的情况,在I/O线程第一次启动时,会计算主从之间的主机时间差,在后续计算复制延迟时,会把这个时间差减掉,这样就可以保证正确获取到复制延迟时间,但是该时......
  • PowerShell教程 - 计算机管理(Computer System Management)
    更新记录转载请注明出处。2022年8月27日发布。2022年8月27日从笔记迁移到博客。计算机管理(ComputerSystemManagement)重启计算机Restart-Computer重命名计算......