LeetCode剑指 Offer 09. 用两个栈实现队列

157 阅读1分钟

这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战

原题地址: leetcode-cn.com/problems/yo…

image.png

思路: 使用两个栈模拟队列, 一个in, 一个out, 当入队时向in push, 出队时判断out是否为空, 如果为空将in栈所有数据pop并push到out栈, 然后返回out.pop.

class CQueue {
    private Stack<Integer> in;
    private Stack<Integer> out;

    public CQueue() {
        in = new Stack<>();
        out = new Stack<>();
    }

    public void appendTail(int value) {
        in.push(value);
    }

    public int deleteHead() {
        if (out.empty()) {
            while (!in.empty()) {
                out.push(in.pop());
            }
        }
        if (out.empty()) {
            return -1;
        }
        return out.pop();
    }
}

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */
type CQueue struct {
	Out Stack
	In  Stack
}

func Constructor() CQueue {
	return CQueue{
		Out: NewStack(),
		In:  NewStack(),
	}
}

func (c *CQueue) AppendTail(value int) {
	c.In.Push(value)
}

func (c *CQueue) DeleteHead() int {
	if !c.Out.Empty() {
		return c.Out.Pop()
	} else {
		for !c.In.Empty() {
			c.Out.Push(c.In.Pop())
		}
	}
	return c.Out.Pop()
}

// Stack 栈
type Stack struct {
	Values []int
}

// NewStack 栈 构造函数
func NewStack() Stack {
	return Stack{Values: make([]int, 0, 5)}
}

// Push 进
func (s *Stack) Push(val int) {
	s.Values = append(s.Values, val)
}

// Pop 出
func (s *Stack) Pop() int {
	values := s.Values
	if s.Empty() {
		return -1
	}
	length := len(values)
	result := values[length-1]
	s.Values = values[:length-1]
	return result
}

func (s *Stack) Peek() int {
	if s.Empty() {
		return -1
	}
	return s.Values[len(s.Values)-1]
}

func (s *Stack) Empty() bool {
	return s.Values == nil || len(s.Values) == 0
}



/**
 * Your CQueue object will be instantiated and called as such:
 * obj := Constructor();
 * obj.AppendTail(value);
 * param_2 := obj.DeleteHead();
 */