使用两个栈,其中一个栈用来中转
package main
import "fmt"
func main() {
q := initQueue()
q.Push(1)
q.Push(2)
q.Push(3)
fmt.Println(q.Pop())
fmt.Println(q.Pop())
q.Push(10)
fmt.Println(q.Pop())
fmt.Println(q.Pop())
fmt.Println(q.Pop())
// s := initStack()
// s.Push(10)
// s.Push(20)
// fmt.Println(s.Pop())
// fmt.Println(s.Pop())
// s.Push(999)
// fmt.Println(s.Pop())
// fmt.Println(s.Pop())
}
type stack struct {
element []int
}
func (s *stack) Len() int {
return len(s.element)
}
func (s *stack) isEmpty() bool {
return s.Len() == 0
}
func (s *stack) Push(num int) {
s.element = append(s.element, num)
}
func (s *stack) Pop() int {
if s.isEmpty() {
fmt.Println("栈已空...")
return -1
} else {
res := s.element[s.Len()-1]
s.element = s.element[:len(s.element)-1]
return res
}
}
func initStack() *stack {
return &stack{
[]int{},
}
}
type queue struct {
s1 *stack
s2 *stack
}
func initQueue() *queue {
return &queue{
s1: initStack(),
s2: initStack(),
}
}
func (q *queue) Pop() int {
if q.s1.isEmpty() && q.s2.isEmpty() {
fmt.Println("队已空...")
return -1
}
if q.s1.isEmpty() {
for q.s2.Len() > 1 {
q.s1.Push(q.s2.Pop())
}
return q.s2.Pop()
} else {
for q.s1.Len() > 1 {
q.s2.Push(q.s1.Pop())
}
return q.s1.Pop()
}
}
func (q *queue) Push(num int) {
if q.s1.isEmpty() {
q.s2.Push(num)
} else {
q.s1.Push(num)
}
}