<算法><go实现>左括号补全-双栈法
输入:1+2)*33-44)*555-666)))
输出:((1+2)*((33-44)*(555-666)))
双栈法,顾名思义,就是用两个栈来实现整个算法。一个栈保存数据,另外一个栈保存运算符。
代码实现及注释:
package main import "fmt" /*
左括号补全算法
*/ type stackString []string func (s *stackString) Push(v string) {
*s = append(*s, v)
} func (s *stackString) Pop() string {
l := len(*s)
if l == 0 {
return ""
}
ret := (*s)[l-1]
*s = (*s)[:l-1]
return ret
} type stackByte []byte func (s *stackByte) Push(v byte) {
*s = append(*s, v)
} func (s *stackByte) Pop() byte {
l := len(*s)
if l == 0 {
return 0
}
ret := (*s)[l-1]
*s = (*s)[:l-1]
return ret
} func isDigit(str string, i *int) *string { if str[*i] > '0' && str[*i] <= '9' {
var retBytes []byte
retBytes = append(retBytes, str[*i])
for j := *i + 1; j < len(str); j++ {
if str[j] > '0' && str[j] <= '9' {
retBytes = append(retBytes, str[j])
} else {
*i = j - 1
ret := string(retBytes)
return &ret
}
}
}
return nil
} func isOpeartor(b byte) bool {
switch b {
case '+', '-', '*', '/':
return true
default:
return false
}
} func main() {
str := "1+2)*33-44)*555-666)))"
dataS := make(stackString, 0)
opS := make(stackByte, 0)
for i := 0; i < len(str); i++ { // 将数字和运算符入栈
if ret := isDigit(str, &i); ret != nil {
dataS.Push(*ret)
} else if isOpeartor(str[i]) {
opS.Push(str[i])
} else { // 取出表达式(数字)和运算符,合并,并重新入栈
d2 := dataS.Pop()
d1 := dataS.Pop()
op := opS.Pop()
exp := "(" + d1 + string(op) + d2 + ")"
dataS.Push(exp)
}
} var exp string
for j := 0; j < len(dataS); j++ {
exp += dataS[j]
} fmt.Println(exp)
}
<算法><go实现>左括号补全-双栈法的更多相关文章
- vim:隆重推荐括号补全插件--auto-pairs
太好用了,括号相关的各种麻烦都一一解决,剩下的就是熟练,熟练,在熟练了.呵呵 连教程都做得这么好,先放这里,以后慢慢翻译. Auto Pairs Insert or delete brackets, ...
- vim之补全1(完全个人定制版)
关于vim的补全最初的感觉是蛋疼, 真正的蛋疼! 由于在接触linux之前曾经在windows下面学过一段时间软件开发, 那时使用的是vs2010, 现在看来虽然vs启动相当的慢, 编辑器的定制和配置 ...
- Xcode括号自动补全以及二次编译后不显示输入
今天遇到了一个大坑,在使用栈来进行计算表达式的时候,发现输入括号就报错,以及二次编译后不显示. 测试了好久,经过无数次debug后. 二次编译不显示还是没搞明白,不过输入倒是没什么问题,就是不显示出来 ...
- Vim 自动补全成对的括号和引号
修改后: 1 :inoremap (()<ESC>i 2:inoremap )<c-r>=ClosePair(')')<CR> 3:inoremap {{}< ...
- 反人类的MyEclipse之-Javascript双引号自动补全
MyEclipse由于在JavaScript中按下一个双引号后会自动把后面的双引号补全.本人习惯两个双引号一起按下,那么这个时候在编辑器里就会出现三个",这样导致代码错误. 今天就因为MyE ...
- centos vi设置tab为4个空格 和括号自动补全
1.打开vim配置文件 vi /etc/vimrc 2.设置tab为4个空格, 在文件末尾添加以下内容 if has( "autocmd" ) filetype plugin in ...
- 解决VS Code开发Python3语言自动补全功能不带括号的问题
Visual Studio Code(以下简称VS Code)用来开发Python3,还是很便利的,本身这个IDE就是轻量级的,才几十兆大小,通过安装插件的方式支持各种语言的开发.界面也美美哒,可以在 ...
- notepad++括号自动补全插件: XBracket Lite
1.4.5.1. 通过XBracket Lite实现括号的自动补全 先去打开相应的设置: 再根据自己的需要去设置: 其中解释一下相应的选项的含义: Treat'' as brackets 把单引号', ...
- Vim设置括号自动补全和快速跳出
一.设置括号自动补全 inoremap ' ''<ESC>i inoremap " ""<ESC>i inoremap ( ()<ESC&g ...
随机推荐
- Oracle函数——COALESCE
COALESCE 含义:COALESCE是一个函数, (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值 ...
- HZOJ 礼物
其实是比较简单的一道期望状压dp,考试时一直在想数组表示概率,然而最后出的数总是小于一,于是无奈的把第一个点判掉放弃了其他点. 设f[i]为状态为i时到全部买到的期望次数,$f[i]=∑f[j]*p[ ...
- android学习——android 常见的错误 和 解决方法
1. Application does not specify an API level requirement! 解决方法:AndroidManifest.xml中 加入: <uses-sdk ...
- E - D Tree HDU - 4812 点分治+逆元
这道题非常巧妙!!! 我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是 当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点,所有绿色的子树节 ...
- php统计近一周和近30天的用户数据
https://blog.csdn.net/shenpengchao/article/details/59073589 先上一张效果图 这边用的是echarts插件http://echarts.bai ...
- 2015,2016 Open Source Yearbook
https://opensource.com/yearbook/2015 The 2015 Open Source Yearbook is a community-contributed collec ...
- dubbo开启access log步骤
1,maven依赖 maven version由2.5.3调整为2.5.3.2 <dependency> <groupId>com.alibaba</groupI ...
- codedecision P1113 同颜色询问 题解 线段树动态开点
题目描述:https://www.cnblogs.com/problems/p/11789930.html 题目链接:http://codedecision.com/problem/1113 这道题目 ...
- 排他网关(ExclusiveGateWay)
网关(ExclusiveGateWay) 作者:邓家海2018年3月11日 00:13:25 情景:某一家公司最近在给一个单位做一个财务审批的OA.具体需求是这样的:当部门申请的金额小于一万块的时候, ...
- H3C PPP MP配置示例二