高频算法面试题(九)- 用两个栈实现队列

135 阅读1分钟

「这是我参与11月更文挑战的第 5 天,活动详情查看:2021最后一次更文挑战

用两个栈实现队列

题目来源LeetCode-剑指 Offer 09. 用两个栈实现队列

题目描述

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例

示例 1

**输入**:["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
**输出**:[null,null,3,-1]

示例 2

**输入**:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
**输出**:[null,-1,null,null,5,2]

提示:

  • 1 <= values <= 10000
  • 最多会对 appendTail、deleteHead 进行 10000 次调用

解题

思路

看到题目首先肯定是想到栈和队列的特性 队列:先进先出(FIFO) :后进先出(LIFO)

要用栈实现队列,首先知道的是,栈只能从一个口进出元素,栈底是最先进去的元素。要想用栈实现队列,那就必须让栈底的元素先出来,这样就需要借助第二个栈。第一个栈复杂”队列“的插入操作,第二个栈负责删除操作,具体过程如下

  • 插入操作,数据直接压入栈1
  • 删除操作,如果栈2不为空,则将栈1中的元素,全部压入栈2中,然后取出栈2的栈顶元素

1.png

说明:在出队的时候,只有当stack2为空的时候,才会将stack1中的元素全部压入stack2中。具体看代码

代码

// 两个栈实现队列
type CQueue struct {
	stack1 []int
	stack2 []int
}

func Constructor() CQueue {
	return CQueue{
		stack1: []int{},
		stack2: []int{},
	}
}

// 入队都从stack1入
func (this *CQueue) AppendTail(value int)  {
	this.stack1 = append(this.stack1, value)
}

// 出队
func (this *CQueue) DeleteHead() int {
	if len(this.stack2) == 0 {
		for len(this.stack1) > 0 {
			this.stack2 = append(this.stack2, this.stack1[len(this.stack1)-1])
			this.stack1 = this.stack1[:len(this.stack1)-1]
		}
	}
	if len(this.stack2) > 0 {
		value := this.stack2[len(this.stack2)-1]
		this.stack2 = this.stack2[:len(this.stack2)-1]
		return value
	}

	return -1
}