后缀表达式求值

数据结构课摸鱼写着玩的东西,可以优化的地方应该非常多(比如存入切片的操作可以在输入时完成,不支持小数,没有解决"要一杯洗脚水"这样的问题……),看着图一乐就好

关于什么是后缀表达式:后缀表达式

大体想法是用字符串读入数字与符号,然后存入int32的切片去处理,处理的时候是看到符号后就近计算为一个数字

package main

import "fmt"

//用于输入带' '的字符串
func ScanLine() string {
	var c byte
	var err error
	var b []byte
	for ; err == nil; {
		_, err = fmt.Scanf("%c", &c)
		if c != '\n' {
			b = append(b, c)
		} else {
			break;
		}
	}
	return string(b)
}

func main(){
	var str string
	str=ScanLine()
	arr:=[]int32{}
	k:=int32(0)
	for _,j:=range str{
		if j==' '{
			arr=append(arr,k)
			k=0
		}else {
			//if和else if用于处理负数,'-'减'0'等于-3,类似的可以做到小数,不过偷懒没写
			if k==-3 {
				k = '0' - j
			}else if k<0{
				k*=10
				k-=j-'0'
			}else{
				k*=10
				k+=j-'0'
				}
			}
	}
	arr=append(arr,k)
	// '+' -5
	// '-' -3
	// '*' -6
	// '/' -1
	lenArr:=len(arr)
	arr=append(arr,0)
	i:=0
	for {
		if i==lenArr {break}
		//如果arr[i]是一个运算符则把包括arr[i]的式子算出来,变为一个数字再写进去
		switch arr[i] {
		case -5:
			arr[i-2]+=arr[i-1]
			arr=append(arr[:i-1],arr[i+1:]...)
			lenArr-=2
			i--
		case -3:
			arr[i-2]-=arr[i-1]
			arr=append(arr[:i-1],arr[i+1:]...)
			lenArr-=2
			i--
		case -6:
			arr[i-2]*=arr[i-1]
			arr=append(arr[:i-1],arr[i+1:]...)
			lenArr-=2
			i--
		case -1:
			arr[i-2]/=arr[i-1]
			arr=append(arr[:i-1],arr[i+1:]...)
			lenArr-=2
			i--
		default:
			i++
		}
	}
	fmt.Println(arr[0])
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值