<算法><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 ...
随机推荐
- Laravel 的HTTP控制器
简介# 除了在路有文件中以闭包的形式定义所有的请求处理逻辑外,还可以使用控制器类来组织此类行为,控制器能够将相关 的请求处理逻辑组成的一个单独的类,控制器被存放在app/Http/Controller ...
- C语言中内存的管理
一.动态内存分配与释放 1.为什么要使用动态内存分配,以下看一个实例,关于超市中购买记录的一段程序 #include <stdio.h> #include <string.h> ...
- day5_python之subprocess模块
subprocess作用:用来执行系统命令它会开启一个子进程,通过子进程去执行一些命令 读取正确的命令执行结果,如果没有指定把结果输出到哪里,默认打印到屏幕上 #subprocess.Popen(r' ...
- 如何使用jmeter调用soap协议
- ORA-01089: 即時シャットダウン処理中 - 操作はできません
一:当时的情景 SQL> shutdown immediate --无任何返回结果 二:问题定位过程 1.查询相关进程只有ORACLE的关键进程存在 ps -ef |grep ora_ soad ...
- H3C 面向连接和无连接的服务
- Fragment学习(一) :生命周期
一. 何为Fragment Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个Activity中来创建一个多面界面,并且你可以在多个Activity ...
- python模块之包
包:将解决一类问题的模块放在同一目录下就形成了一个包 为了更好的了解包,我们就模拟创建一个包 import os os.makedirs('glance/api') os.makedirs('glan ...
- 2018-2-13-win10-uwp-InkCanvas控件数据绑定
title author date CreateTime categories win10 uwp InkCanvas控件数据绑定 lindexi 2018-2-13 17:23:3 +0800 20 ...
- PowerShell 拿到显卡信息
本文告诉大家如何在 PowerShell 通过 WMI 拿到显卡信息 在 PowerShell 可以使用下面代码拿到显卡的信息 Get-WmiObject Win32_VideoController ...