题解 | #四则运算#

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

package main
import (
	"os"
	"bufio"
	"fmt"
	"strconv"
	"strings"
)
type Stake struct{
	con []string
}
func (thisS *Stake)push(s string){
	thisS.con = append(thisS.con, s)
}
func (thisS *Stake)pop()(s string){
	s = thisS.con[len(thisS.con)-1]
	thisS.con = thisS.con[:len(thisS.con)-1]
	return
}
func main(){
	input:=bufio.NewScanner(os.Stdin)
	input.Scan()
	data:=input.Text()
	d:=strings.Split(data,"")
	youxianji:=map[string]int{
		"*":3,"/":3,"+":2,"-":2,"(":1,"{":1,"[":1,
	}
	//先搞个栈,这里因为只要压入删除功能,所以简单一点
	var s Stake
	s.con = make([]string,0)
	//准备个字符切片用来放字符,因为有多位数,所以要切片
	houzhui:=make([]string,0)
	lend:=len(d)
	for i:=0;i<lend;i++{
        if (d[i]>="0"&&d[i]<="9")||(i>0&&d[i]=="-"&&(d[i-1]>"9"||d[i-1]<"0")&&d[i-1]!="}"&&d[i-1]!="]"&&d[i-1]!=")"){
			str := d[i]
            if i!=lend-1{
                i++
			for d[i]>="0"&&d[i]<="9"&&i!=lend-1{
				str = str + d[i]
				i++
			}
			i--
            }
			
			houzhui = append(houzhui,str)
		}else if d[i]=="("||d[i]=="["||d[i]=="{"{
			s.push(d[i])
		}else if d[i]=="}"||d[i]=="]"||d[i]==")"{
			now := s.pop()
			for now!="("&&now!="["&&now!="{"{
				houzhui = append(houzhui,now)
				now =s.pop()

			}
		}else {
			for len(s.con)!=0&&youxianji[d[i]]<=youxianji[s.con[len(s.con)-1]]{
				houzhui = append(houzhui,s.pop())
			}
			s.push(d[i])
		}

	}
	for len(s.con)!=0{
		houzhui = append(houzhui,s.pop())
	}
	//后缀表达式搞完了,接着搞答案
	//搞两个栈放数和运算符号,放进去
	signzhan := Stake{}
	signzhan.con = make([]string,0)
	numzhan := Stake{}
	numzhan.con = make([]string,0)
	for _,i:=range houzhui{
		if i!="+"&&i!="-"&&i!="*"&&i!="/"{
			numzhan.push(i)
		}else {
			num2 := numzhan.pop()
			num1:=numzhan.pop()
			n1,_:=strconv.Atoi(num1)
			n2,_:=strconv.Atoi(num2)
			switch i {
			case "+":numzhan.push(strconv.Itoa(n1+n2))
			case "-":numzhan.push(strconv.Itoa(n1-n2))
			case "*":numzhan.push(strconv.Itoa(n1*n2))
			case "/":numzhan.push(strconv.Itoa(n1/n2))
				
			
			}
		}
	}
	fmt.Println(numzhan.pop())

}



全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 14:45
bg是二本双一流硕,目标是Java后端开发岗,投暑期实习0大厂面试,只有极少的大厂测开,可能投的晚加上简历太烂加上0实习?求大佬们给个建议
程序员小白条:别去小厂,初创或者外包,尽量去中小,100-499和500-999,专门做互联网产品的,有公司自研的平台和封装的工具等等,去学习一些业务相关的,比如抽奖,积分兑换,SSO认证,风控,零售等等,目标 Java 后端开发吗?你要不考虑直接走大厂测开?如果技术不行的话,有面试你也很难过的
实习,不懂就问
点赞 评论 收藏
分享
06-15 18:44
黄淮学院 Java
Lynn012:如果是居民楼还是算了吧,看着有点野呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务