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

题目描述

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

解题思路

这个问题可以使用两个栈来模拟队列的操作,一个栈用于入队操作,另一个栈用于出队操作。具体步骤如下:

  1. 使用两个栈,一个称为 stackIn 用于入队操作,另一个称为 stackOut 用于出队操作。

  2. 对于 appendTail 操作,直接将元素推入 stackIn

  3. 对于 deleteHead 操作,首先检查 stackOut 是否为空。如果不为空,直接从 stackOut 出栈并返回栈顶元素。如果 stackOut 为空,需要将 stackIn 中的所有元素依次出栈并压入 stackOut 中,然后再从 stackOut 出栈并返回栈顶元素。 

appendTail操作的时间复杂度为O(1),deleteHead操作的平均时间复杂度为O(1),因为元素之多经过两次出栈操作;stackIN用于入队操作,最坏情况包含所有元素,因此空间复杂度是O(n),stackOUT用于出队操作,最坏情况包含所有元素,空间复杂度是O(n)。

代码及结果

class CQueue {
private:
	std::stack stackIN;
	std::stack stackOUT;
public:
	CQueue(){}

	void addTail(int value)
	{
		stackIN.push(value);
	}

	int deleteHead()
	{
		if (stackOUT.empty())
		{
			while (!stackIN.empty())
			{
				stackOUT.push(stackIN.top());
				stackIN.pop();
			}
		}

		if (stackOUT.empty())
			return -1;
		else
		{
			int head = stackOUT.top();
			stackOUT.pop();
			return head;
		}
	}
};

剑指 Offer 09. 用两个栈实现队列_第1张图片

你可能感兴趣的:(数据结构)