一.栈实现队列
栈和队列实现非常相似,能否使用栈先进后进的特性实现队列先进先出的特性
1.1 解决方案
准备两个栈来实现队列,分别为stack_in和stack_out
- 当有新元素需要入栈时,将元素插入
stack_in中 - 当需要出栈时,当
stack_out.size() = 00时,将stack_in的元素依次压入stack_out中 - 当
stack.size() > 0时,将stack_out的元素弹出
1.2 入队列
将1,2,3,4依次插入stack_in中
# 面试题:使用两个栈来实现一个队列,完成队列的Push和Pop操作,可以看一下这个大佬的博客
1.3 出队列
把stack_in的元素依次插入到stack_out
二.栈实现队列重要接口实现
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;
}
答案: