题目:使用有限个栈实现队列,保证每个队列操作都只需要常数此栈的操作
初看题目感觉似乎单个栈可以在常数次栈操作的情况下实现出队列或者入队列的操作,但是考虑到可以使用多个栈,则可以优化相应的出入队列时间。为此选择两个栈来实现队列。其中一个栈实现入队列操作,另一个栈负责出队列操作,入队列只需要使用栈的push操作即可,但出队列则需要进行一次“倒入”操作,将控制入队列的栈中的元素“倒入”出队列中。如此均摊下来基本上可以实现O(1)时间复杂对的出入队列操作。
算法步骤:
- 入队列--直接将元素插入栈1中,时间复杂度O(1)。
- 出队列--如果栈2为空,将栈1中的元素“倒入”栈2中,然后将栈2的栈顶元素取出即可,否则直接取出栈2的栈顶元素
#ifndef MY_QUEUE_H
#define MY_QUEUE_H
#include <stack>
template <class T>
class my_queue
{
public:
my_queue(){}
~my_queue(){}
bool isEmpty() const;
void enqueue(const T& t){s1.push(t);}
T dequeue();
private:
std::stack<T> s1;
std::stack<T> s2;
};
template<class T>
bool my_queue<T>::isEmpty()const
{
if(s1.empty() && s2.empty())
{
return true;
}
return false;
}
template<class T>
T my_queue<T>::dequeue()
{
T res;
if(s2.empty())
{
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
res = s2.top();
s2.pop();
return res;
}
#endif
测试代码如下所示:
#include "my_queue.h"
#include <iostream>
using namespace std;
void main()
{
my_queue<int> q;
int item;
cout<<"Input the item of the queue (exit 0) :";
cin>>item;
while(item != 0)
{
q.enqueue(item);
cin>>item;
}
while (!q.isEmpty())
{
cout<<q.dequeue()<<" ";
}
cout<<endl;
}