使用两个栈,其中一个栈用来中转

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)
	}
}