入栈和出栈代码实现如下:

package main
import ("fmt""errors"
)//使用数组来模拟一个栈的使用
type Stack struct {MaxTop int  // 表示我们栈最大可以存放数个数Top int // 表示栈顶, 因为栈顶固定,因此我们直接使用Toparr [5]int // 数组模拟栈
}
//入栈
func (this *Stack) Push(val int) (err error) {//先判断栈是否满了if this.Top == this.MaxTop - 1 {fmt.Println("stack full")return errors.New("stack full")}this.Top++//放入数据this.arr[this.Top] = valreturn
}//出栈
func (this *Stack) Pop() (val int, err error) {//判断栈是否空if this.Top == -1 {fmt.Println("stack empty!")return 0, errors.New("stack empty")}//先取值,再 this.Top--val =  this.arr[this.Top]this.Top--return val, nil
}//遍历栈,注意需要从栈顶开始遍历
func (this *Stack) List() {//先判断栈是否为空if this.Top == -1 {fmt.Println("stack empty")return}fmt.Println("栈的情况如下:")for i := this.Top; i >= 0; i-- {fmt.Printf("arr[%d]=%d\n", i, this.arr[i])}
}func main() {stack := &Stack{MaxTop : 5, // 表示最多存放5个数到栈中Top : -1, // 当栈顶为-1,表示栈为空}//入栈stack.Push(1)stack.Push(2)stack.Push(3)stack.Push(4)stack.Push(5)stack.List()//显示//出栈val, _ := stack.Pop()fmt.Println("出栈val=", val) // 5stack.List() //显示
}

执行结果如下图所示:

表达式的入栈出栈详细过程代码如下:

package main
import ("fmt""errors""strconv"
)//使用数组来模拟一个栈的使用
type Stack struct {MaxTop int  // 表示我们栈最大可以存放数个数Top int // 表示栈顶, 因为栈顶固定,因此我们直接使用Toparr [20]int // 数组模拟栈
}
//入栈
func (this *Stack) Push(val int) (err error) {//先判断栈是否满了if this.Top == this.MaxTop - 1 {fmt.Println("stack full")return errors.New("stack full")}this.Top++//放入数据this.arr[this.Top] = valreturn
}//出栈
func (this *Stack) Pop() (val int, err error) {//判断栈是否空if this.Top == -1 {fmt.Println("stack empty!")return 0, errors.New("stack empty")}//先取值,再 this.Top--val =  this.arr[this.Top]this.Top--return val, nil}
//遍历栈,注意需要从栈顶开始遍历
func (this *Stack) List() {//先判断栈是否为空if this.Top == -1 {fmt.Println("stack empty")return}fmt.Println("栈的情况如下:")for i := this.Top; i >= 0; i-- {fmt.Printf("arr[%d]=%d\n", i, this.arr[i])}
}//判断一个字符是不是一个运算符[+, - , * , /]
func (this *Stack) IsOper(val int) bool {if val == 42 || val == 43 || val == 45 || val == 47 {return true} else {return false}
}//运算的方法
func (this *Stack) Cal(num1 int, num2 int, oper int) int{res := 0switch oper {case 42 :res = num2 * num1case 43 :res = num2 + num1case 45 :res = num2 - num1case 47 :res = num2 / num1default :fmt.Println("运算符错误.")}return res
}//编写一个方法,返回某个运算符的优先级[程序员定义]
//[* / => 1 + - => 0]
func (this *Stack) Priority(oper int) int {res := 0if oper == 42 || oper == 47 {res = 1} else if oper == 43 || oper == 45 {res = 0}return res
}func main() {//数栈numStack := &Stack{MaxTop : 20,Top : -1,}//符号栈operStack := &Stack{MaxTop : 20,Top : -1,}exp := "30+30*6-4-6"//定义一个index ,帮助扫描expindex := 0//为了配合运算,我们定义需要的变量num1 := 0num2 := 0oper := 0result := 0keepNum := ""for {//这里我们需要增加一个逻辑,处理多位数的问题ch := exp[index:index+1] // 字符串.//ch ==>"+" ===> 43temp := int([]byte(ch)[0]) // 就是字符对应的ASCiI码if operStack.IsOper(temp) { // 说明是符号//如果operStack  是一个空栈, 直接入栈if operStack.Top == -1 { //空栈operStack.Push(temp)}else {//如果发现opertStack栈顶的运算符的优先级大于等于当前准备入栈的运算符的优先级//,就从符号栈pop出,并从数栈也pop 两个数,进行运算,运算后的结果再重新入栈//到数栈, 当前符号再入符号栈if operStack.Priority(operStack.arr[operStack.Top]) >=operStack.Priority(temp) {num1, _ = numStack.Pop()num2, _ = numStack.Pop()oper, _ = operStack.Pop()result = operStack.Cal(num1,num2, oper)//将计算结果重新入数栈numStack.Push(result)//当前的符号压入符号栈operStack.Push(temp)}else {operStack.Push(temp)}}} else { //说明是数//处理多位数的思路:1.定义一个变量 keepNum string, 做拼接keepNum += ch//2.每次要向index的后面字符测试一下,看看是不是运算符,然后处理//如果已经到表达最后,直接将 keepNumif index == len(exp) - 1 {val, _ := strconv.ParseInt(keepNum, 10, 64)numStack.Push(int(val))} else {//向index 后面测试看看是不是运算符 [index]if operStack.IsOper(int([]byte(exp[index+1:index+2])[0])) {val, _ := strconv.ParseInt(keepNum, 10, 64)numStack.Push(int(val))keepNum = ""}}}//继续扫描,先判断index是否已经扫描到计算表达式的最后if index + 1 == len(exp) {break}index++}//如果扫描表达式 完毕,依次从符号栈取出符号,然后从数栈取出两个数,//运算后的结果,入数栈,直到符号栈为空for {if operStack.Top == -1 {break //退出条件}num1, _ = numStack.Pop()num2, _ = numStack.Pop()oper, _ = operStack.Pop()result = operStack.Cal(num1,num2, oper)//将计算结果重新入数栈numStack.Push(result)}//如果我们的算法没有问题,表达式也是正确的,则结果就是numStack最后数res, _ := numStack.Pop()fmt.Printf("表达式%s = %v", exp, res)
}

执行结果如下:

Go语言_数据结构_栈(包括入栈和出栈,表达式的入栈出栈详细过程代码实现)相关推荐

  1. 数据结构c语言版袁和金答案,_数据结构_课程教学中的案例设计及应用_袁和金.pdf...

    _数据结构_课程教学中的案例设计及应用_袁和金 第 16 期 90 2013 年 8 月 25 日 Computer Education G642 袁和金 (华北电力大学 计算机系,河北 保定 071 ...

  2. 数据结构背包问题c语言思路,C语言学习趣事_数据结构_经典命题_1_背包问题_分析_1...

    /*1.问题描述 假设有一个能装入总体积为T的背包和n件体积分别为w1,w2,-wn的物品, 能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+-+wm=T, 要求找出所有满足上述条件的解. 例 ...

  3. 希尔排序python 简书_数据结构_排序_直接插入+希尔排序

    数据结构_排序_直接插入排序+希尔排序 其实主要是为了讲述希尔排序,不过插入排序是希尔排序的基础,因此先来讲直接插入排序. 一.直接插入排序 1.原理 下标 0 1 2 3 4 5 6 7 8 -- ...

  4. linux中数据库的4种状态,数据库的数据持久有几种方案_数据库_数据管理_数据结构_课课家...

    容器中的数据可以存储在容器层.但是将数据存放在容器层存在以下问题: 数据不是持久化.意思是如果容器删除了,这些数据也就没了 主机上的其它进程不方便访问这些数据 对这些数据的I/O会经过存储驱动,然后到 ...

  5. SCAU程序设计在线实训平台_实验_数据结构_实验4

    8606 二叉树的构建及遍历操作[有手就行] Description 构造二叉链表表示的二叉树:按先序次序输入二叉树中结点的值(一个字符),'#'字符表示空树,构造二叉链表表示的二叉树T:再输出三种遍 ...

  6. java中缀表达式转后缀表达式_数据结构Java实现06----中缀表达式转换为后缀表达式...

    本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...

  7. c语言中缀表达式求值_数据结构考研笔记之栈与队列(四)栈与队列应用括号匹配、中缀表达式转前缀后缀问题...

    文字:独木 排版:独木 图片:独木 栈与队列 1.括号匹配问题 栈 例题1 例题2-----不匹配例题1 例题3-----不匹配例题2 2. 表达式求值问题 例题 1.中缀表达式转前缀表达式 2.中缀 ...

  8. c语言中缀表达式求值_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)

    第三章:栈和队列 下面讲解栈的应用主要内容有:栈的应用.括号匹配.中 后 前 缀表达式转换 1.栈的应用 1.1括号匹配 我们在数学运算中 [(A+b)*c] - (E-F) 往往都会有[ ] 和 ( ...

  9. c语言栈的实现以及操作_数据结构之链栈基本操作的实现详解(C语言描述)

    迎新过后,来带领你好好学习的小软准时归来,快带着上次学习链表操作的记忆和我开启新的旅程吧: 链栈:就是栈的链式存储结构,简称链栈. 首先我们要考虑的就是链栈的存储结构,由于栈只是在栈顶进行插入和删除操 ...

最新文章

  1. android 中的PopupWindow
  2. vmware esxi的安装
  3. java环形数组_Java数组模拟环形队列
  4. circRNA研究相关数据库,riboCIRC使用指南
  5. SQLSever触发器建立
  6. Oracle修改redo log大小的方法
  7. Flowable 数据库表结构 ACT_ID_USER
  8. CentOs搭建svn
  9. 公司消费一卡通“变法”记
  10. 解析MOS管电流方向反及其体二极管能过多大电流问题
  11. html 空格怎么打,空白空格怎么打?
  12. 求求你了!别瞎提交代码了,看人家 Git 提交规范那叫一个舒服!
  13. ubuntu下bitcoin core的安装和编译
  14. Tire Defect Detection Using Fully Convolutional Network-论文阅读笔记
  15. 一个有意思的需求——中文匹配度
  16. YBTOJ反素数洛谷P1463(数论)
  17. 点云特征提取--vfh
  18. android 支付sdk流程,支付SDK
  19. 儿童学习桌好吗?与普通书桌相比怎么样
  20. linux 开发工具集合

热门文章

  1. vue3项目之路由 mate 元信息处理
  2. 用python+pygame写的宝石迷阵小游戏
  3. sw钣金插件_用SW钣金设计的弯头圆管,此图难度不大,主要是找一个合适的画法...
  4. 台式计算机不用待机还是关机好,电脑长时间待机的坏处 不关机对电脑的损害大吗...
  5. 计算机键盘常识打字教案,认识键盘教案
  6. 曹建老师Tensorflow笔记——神经网络搭建八股
  7. java在Linux平台调用标签打印机
  8. 谈谈如何去赚巨头的钱
  9. VR沉浸感和交互作用原理
  10. POI2015 WIL-Wilcze doły