栈是一种先入后出的有序列表。限制了线性表中元素的插入和删除只能在线性表的同一端进行。允许插入和删除的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
type Stack struct {
MaxTop int //栈最大可以存放的数的个数
Top int //表示栈顶的索引id,初始值为-1,最大值为MaxTop-1
arr [5]int //数组模拟栈
}
func (s *Stack) Push(val int) error {
if s.Top == s.MaxTop-1 {
return errors.New("栈满了")
}
s.Top++
s.arr[s.Top] = val
return nil
}
func (s *Stack) Pop() (int, error) {
if s.Top == -1 {
return 0, errors.New("空栈")
}
res := s.arr[s.Top]
s.arr[s.Top] = 0
s.Top--
return res, nil
}
func (s *Stack) List() {
if s.Top == -1 {
fmt.Println("空栈")
}
for i := 0; i < s.Top+1; i++ {
fmt.Printf("arr[%v]=%v\n", i, s.arr[i])
}
}
package main
import (
"errors"
"fmt"
)
type Stack struct {
MaxTop int //栈最大可以存放的数的个数
Top int //表示栈顶,因为栈顶固定,因此我们可以直接使用Top
arr [5]int //数组模拟栈
}
func main() {
myStack := Stack{
MaxTop: 5,
Top: -1, //默认值,栈为空
}
myStack.Push(1)
myStack.Push(4)
myStack.Push(9)
fmt.Println("top是:", myStack.Top)
myStack.List()
fmt.Println("开始pop1个")
val, _ := myStack.Pop()
fmt.Println("top是:", myStack.Top)
fmt.Println("pop值:", val)
myStack.List()
fmt.Println("再pop1个")
val2, _ := myStack.Pop()
fmt.Println("top是:", myStack.Top)
fmt.Println("pop值:", val2)
myStack.List()
fmt.Println("再pop1个")
val3, _ := myStack.Pop()
fmt.Println("top是:", myStack.Top)
fmt.Println("pop值:", val3)
myStack.List()
}
func (s *Stack) Push(val int) error {
if s.Top == s.MaxTop-1 {
return errors.New("栈满了")
}
s.Top++
s.arr[s.Top] = val
return nil
}
func (s *Stack) Pop() (int, error) {
if s.Top == -1 {
return 0, errors.New("空栈")
}
res := s.arr[s.Top]
s.arr[s.Top] = 0
s.Top--
return res, nil
}
func (s *Stack) List() {
if s.Top == -1 {
fmt.Println("空栈")
}
for i := 0; i < s.Top+1; i++ {
fmt.Printf("arr[%v]=%v\n", i, s.arr[i])
}
}
package main
import (
"errors"
"fmt"
"strconv"
"unicode"
)
type Stack struct {
MaxTop int //栈最大可以存放的数的个数
Top int //表示栈顶
arr [20]int //数组模拟栈
}
var itobMap = map[int]byte{
1: '+',
2: '-',
3: '*',
4: '/',
}
var btoiMap = map[byte]int{
'+': 1,
'-': 2,
'*': 3,
'/': 4,
}
var opePriorityMap = map[byte]int{
'+': 1,
'-': 1,
'*': 2,
'/': 2,
}
func main() {
expStr := "3+2*6-2"
expStrArr := []byte(expStr)
a := operation(expStrArr)
fmt.Println(a)
}
func (s *Stack) Push(val int) error {
if s.Top == s.MaxTop-1 {
return errors.New("栈满了")
}
s.Top++
s.arr[s.Top] = val
return nil
}
func (s *Stack) Pop() (int, error) {
if s.Top == -1 {
return 0, errors.New("空栈")
}
res := s.arr[s.Top]
s.arr[s.Top] = 0
s.Top--
return res, nil
}
func (s *Stack) List() {
if s.Top == -1 {
fmt.Println("空栈")
}
for i := 0; i < s.Top+1; i++ {
fmt.Printf("arr[%v]=%v\n", i, s.arr[i])
}
}
func operation(expStr []byte) int {
numStack := Stack{
MaxTop: 20,
Top: -1,
}
opeStack := Stack{
MaxTop: 20,
Top: -1,
}
//入栈
for _, v := range expStr {
vInt, _ := strconv.Atoi(string(v))
if unicode.IsDigit(rune(v)) {
numStack.Push(vInt)
} else {
if opeStack.Top == -1 {
opeStack.Push(btoiMap[v])
} else {
if opeStack.arr[opeStack.Top] >= opePriorityMap[v] {
opeVal, _ := opeStack.Pop()
numVal2, _ := numStack.Pop()
numVal1, _ := numStack.Pop()
resTmp := simpleOpe(numVal1, numVal2, itobMap[opeVal])
numStack.Push(resTmp)
opeStack.Push(btoiMap[v])
} else {
opeStack.Push(btoiMap[v])
}
}
}
}
//符号出栈
for opeStack.Top >= 0 {
opeTmp, _ := opeStack.Pop()
numVal2, _ := numStack.Pop()
numVal1, _ := numStack.Pop()
resTmp := simpleOpe(numVal1, numVal2, itobMap[opeTmp])
numStack.Push(resTmp)
}
res, _ := numStack.Pop()
return res
}
func simpleOpe(a, b int, operation byte) int {
if operation == '+' {
return a + b
} else if operation == '-' {
return a - b
} else if operation == '*' {
return a * b
} else {
return a / b
}
}