38.两个栈实现队列

135 阅读1分钟

一.栈实现队列

栈和队列实现非常相似,能否使用栈先进后进的特性实现队列先进先出的特性

1.1 解决方案

准备两个栈来实现队列,分别为stack_instack_out

  1. 当有新元素需要入栈时,将元素插入stack_in
  2. 当需要出栈时,当stack_out.size() = 00时,将stack_in的元素依次压入stack_out
  3. stack.size() > 0时,将stack_out的元素弹出

1.2 入队列

1,2,3,4依次插入stack_in

image.png # 面试题:使用两个栈来实现一个队列,完成队列的Push和Pop操作,可以看一下这个大佬的博客

1.3 出队列

stack_in的元素依次插入到stack_out

image.png

二.栈实现队列重要接口实现

2.1 结构

template<typename T>
class stackQueue :public Queue<T>
{
protected:
	linkStack<T> stack_in;
	linkStack<T> stack_out;

2.2 入队列

先将元素全部压入到stack_in

void add(const T& e)
{
	stack_in.push(e);
}

2.3 出队列

先判断stack_out中是否有元素,如果有,则将其弹出


void remove()
{
	if (stack_out.size() > 0)
	{
		stack_out.pop();
	}
	else
	{
		cout << "no elem to pop" << endl;
	}
}

2.4 完整代码

#pragma once

#include "linkStack.h"
#include "Queue.h"

template<typename T>
class stackQueue :public Queue<T>
{
protected:
	mutable linkStack<T> stack_in;
	mutable linkStack<T> stack_out;

	void move()const
	{
		if (stack_out.size() == 0)
		{
			while (stack_in.size() > 0)
			{
				stack_out.push(stack_in.top());
				stack_in.pop();
			}
		}

	}

public:
	void add(const T& e)
	{
		stack_in.push(e);
	}

	void remove()
	{
		if (stack_out.size() > 0)
		{
			stack_out.pop();
		}
		else
		{
			cout << "no elem to pop" << endl;
		}
	}

	T front() const
	{
		move();

		if (stack_out.size() > 0)
		{
			return stack_out.top();
		}
		else
		{
			cout << "no elem in front" << endl;
		}
	}

	void clear()
	{
		remove();
	}

	int size()
	{
		return stack_in.size() + stack_out.size();
	}
};

2.5 测试代码

#include <iostream>
#include "stackToQueue.h"

int main()
{
	stackQueue<int> queue;

	for (int i = 0; i < 5; i++)
	{
		queue.add(i);
	}


	while(queue.size() > 0)
	{
		cout << queue.front() << endl;
		queue.remove();
	}

	return 0;
}

答案:

image.png