<算法><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 ...
随机推荐
- SQLServer一条SQL查出当月的每一天
from master..spt_values ),,),'2013-02-03')+'-01' as datetime)) 结果: 返回带有年月日的日期 ),),) AS datetime) fro ...
- OracleSpatial函数实例
Oracle Spatial操作geometry方法 Oracle Spatial中SDO_GEOMETRY类型: CREATE TYPE SDO_GEOMETRY AS OBJECT( SDO_ ...
- OpenStack组件系列☞glance搭建
第一步:glance关于数据库的操作 mysql -u root -p #登入数据库 CREATE DATABASE glance; #新建库keystone GRANT ALL PRIVILEGES ...
- react框架下,在页面内加载显示PDF文件,关于react-pdf-js的使用注意事项
react框架下,在页面内加载显示PDF文件,关于react-pdf-js的使用注意事项 之前做了一个需求,在注册账号的时候,让用户同意服务条款, 服务条款是一个PDF文件, 这就需要在react内加 ...
- 使用提示(Hints)
对于表的访问,可以使用两种Hints. FULL 和 ROWID FULL hint 告诉ORACLE使用全表扫描的方式访问指定表. 例如: SELECT /*+ FULL(EMP) */ * FRO ...
- Java JDBC学习实战(二): 管理结果集
在我的上一篇博客<Java JDBC学习实战(一): JDBC的基本操作>中,简要介绍了jdbc开发的基本流程,并详细介绍了Statement和PreparedStatement的使用:利 ...
- Python--day63--图书管理系统表结构设计
pycharm中运行manage.py的工具: 1,将变更翻译成SQL语句,去数据库中执行(ORM操作过数据库后都要执行这两条命令) 2,ForeignKey会自动在属性后面加_id 3,ORM封装p ...
- centos linux ip地址无法连接数据库,ssh登录服务器时必须使用22端口
问题一:连接数据库时直接使用ip地址无法连接,必须使用ssh方式才能连接? 问题二:ssh登录服务器时必须使用22端口,在/etc/ssh/sshd_config中添加了10086端口,防火墙中已开启 ...
- Python--day46--MySQL自定义函数
1,mysql自定义函数(mysql函数会降低查找速度,使用 了函数的行和列不能再用索引查找了,这样对性能要求高的需求就不能这样写) 函数调用 select f(参数1,参数2): 对函数进行调用:
- C# 序列类为 xml 可以使用的特性大全
本文告诉大家如何使用序列类,以及序列时可以用到的特性,特性的作用和一些容易被问的问题 最近我在把项目文件修改为 VisualStudio 2017 的格式,请看从以前的项目格式迁移到 VS2017 新 ...