输入: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实现>左括号补全-双栈法的更多相关文章

  1. vim:隆重推荐括号补全插件--auto-pairs

    太好用了,括号相关的各种麻烦都一一解决,剩下的就是熟练,熟练,在熟练了.呵呵 连教程都做得这么好,先放这里,以后慢慢翻译. Auto Pairs Insert or delete brackets, ...

  2. vim之补全1(完全个人定制版)

    关于vim的补全最初的感觉是蛋疼, 真正的蛋疼! 由于在接触linux之前曾经在windows下面学过一段时间软件开发, 那时使用的是vs2010, 现在看来虽然vs启动相当的慢, 编辑器的定制和配置 ...

  3. Xcode括号自动补全以及二次编译后不显示输入

    今天遇到了一个大坑,在使用栈来进行计算表达式的时候,发现输入括号就报错,以及二次编译后不显示. 测试了好久,经过无数次debug后. 二次编译不显示还是没搞明白,不过输入倒是没什么问题,就是不显示出来 ...

  4. Vim 自动补全成对的括号和引号

    修改后: 1 :inoremap (()<ESC>i 2:inoremap )<c-r>=ClosePair(')')<CR> 3:inoremap {{}< ...

  5. 反人类的MyEclipse之-Javascript双引号自动补全

    MyEclipse由于在JavaScript中按下一个双引号后会自动把后面的双引号补全.本人习惯两个双引号一起按下,那么这个时候在编辑器里就会出现三个",这样导致代码错误. 今天就因为MyE ...

  6. centos vi设置tab为4个空格 和括号自动补全

    1.打开vim配置文件 vi /etc/vimrc 2.设置tab为4个空格, 在文件末尾添加以下内容 if has( "autocmd" ) filetype plugin in ...

  7. 解决VS Code开发Python3语言自动补全功能不带括号的问题

    Visual Studio Code(以下简称VS Code)用来开发Python3,还是很便利的,本身这个IDE就是轻量级的,才几十兆大小,通过安装插件的方式支持各种语言的开发.界面也美美哒,可以在 ...

  8. notepad++括号自动补全插件: XBracket Lite

    1.4.5.1. 通过XBracket Lite实现括号的自动补全 先去打开相应的设置: 再根据自己的需要去设置: 其中解释一下相应的选项的含义: Treat'' as brackets 把单引号', ...

  9. Vim设置括号自动补全和快速跳出

    一.设置括号自动补全 inoremap ' ''<ESC>i inoremap " ""<ESC>i inoremap ( ()<ESC&g ...

随机推荐

  1. Laravel 的HTTP请求#

    获取请求# 要通过依赖注入的方式来获取当前HTTP请求的实例,你应该在控制器方法中类型提示Illuminate\Http\Request 传入的请求的实例通过 服务容器自动注入: <?php n ...

  2. VisualStudio 自定义外部命令

    通过自定义命令,可以在 VisualStudio 加上一些自定义命令,可以快速启动 git 或者做其他的事情 添加命令 首先打开工具 外部命令,点击添加,然后在弹出的窗口输入下面内容 例如添加内容是打 ...

  3. Hadoop应用程序示例2

  4. 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。

    环境:景安快云服务器(听说很垃圾,但是公司买的,我也刚来),CentOS-6.8-x86_64,Apache,MySQL5.1,PHP5.3. 问题:现公司有一个php系统,需要重复向后台发送ajax ...

  5. 2003年NOIP普及组复赛题解

    题目涉及算法: 乒乓球:简单字符串模拟: 数字游戏:区间DP: 栈:卡特兰数 麦森数:高精度.快速幂.数学. 乒乓球 题目链接:https://www.luogu.org/problem/P1042 ...

  6. tomcat access日志

    每次看access log都会记不住pattern里的各个标识代表的什么意思,记录下,备忘! tomcat的access log是由实现了org.apache.catalina.AccessLog接口 ...

  7. SpringData Jpa、Hibernate、Jpa 三者之间的关系

    JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架--因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...

  8. 安装vue-cli和安装nuxt

    安装vue-cli:1.npm install vue-cli -g2.vue install webpack 项目名3.cd 项目名4.npm install5.npm i webpack-dev- ...

  9. [C++] 烦人的error LNK2019和error LNK2001

    常见原因: 没有正确的设置引用的lib,新手常犯这个错误,这是最容易解决的问题. extern "C"的问题.如果C++写的dll要给C程序用,那么就要注意extern " ...

  10. 初次使用pycharm 的interpreter option为空解决办法。

    第一步:进入Setting. 第二步:进入Project中的Project Interpreter.选择添加即可.