之前总结面经,看到了这样一个面试题:C++用两个栈模拟实现一个队列。看到这个问题,相信很多人都是在心里鄙视面试官,这是人问的问题吗?不但要写栈,还要用栈实现一个队列,这代码量也忒大了吧!
如果你第一反应也和上面一样,那说明你的C++功底还是有些薄弱,为什么一定要自己写呢,人家面试官有没有强调说要让你写一个栈,为什么不用STL呢?
话不多说,上代码:
#include<iostream>
#include<stack>
using namespace std;
template<typename T>
class SQueue
{
public:
void pop();
void push(const T& val);
const T& front();
bool empty() const;
private:
stack<T>left, right;
void left_to_right();
};
template<typename T>
void SQueue<T>::left_to_right()
{
while (!left.empty())
{
right.push(left.top());
left.pop();
}
}
template<typename T>
bool SQueue<T>:: empty()const
{
return (left.empty() && right.empty());
}
template<typename T>
void SQueue<T>::push(const T& val)
{
left.push(val);
}
template<typename T>
void SQueue<T>::pop()
{
if (!right.empty())
{
right.pop();
}
else if (!left.empty())
{
left_to_right();
}
else
{
throw "The queue is empty,can not pop!";
}
}
template<typename T>
const T& SQueue<T>::front()
{
if (!right.empty())
{
return right.top();
}
else if (!left.empty())
{
left_to_right();
return right.top();
}
else
{
throw "Empty queue can not return front";
}
}
int main()
{
SQueue<int> sq1;
cout << "test queue:";
for (int i = 0; i < 10; ++i)
{
sq1.push(i);
}
while (!sq1.empty())
{
cout<<sq1.front()<<" ";
sq1.pop();
}
cout << endl;
return 0;
}
同样的如果面试官如果问你用两个队列实现一个栈,那你也可以使用STL来完成,代码如下:
#include<iostream>
#include<queue>
using namespace std;
template<typename T>
class QStack
{
public:
void pop();
void push(const T& val);
const T& top();
bool empty();
private:
void left_to_right();
queue<T> left, right;
};
template<typename T>
void QStack<T>::left_to_right()
{
if (!left.empty())
{
int move = left.size() - 1;
while (move>0)
{
right.push(left.front());
left.pop();
--move;
}
}
}
template<typename T>
bool QStack<T>::empty()
{
return (left.empty() && right.empty());
}
template<typename T>
void QStack<T>::push(const T& val)
{
left.push(val);
}
template<typename T>
void QStack<T>::pop()
{
left_to_right();
left.swap(right);
right.pop();
}
template<typename T>
const T& QStack<T>::top()
{
if (!left.empty())
{
left_to_right();
left.swap(right);
const T& tmp = right.front();
left.push(right.front());
right.pop();
return tmp;
}
else
{
throw "Empty stack can not return top !";
}
}
int main()
{
QStack<int> qs1;
cout << "test stack:";
for (int i = 0; i < 10; ++i)
{
qs1.push(i);
}
while (!qs1.empty())
{
cout <<qs1.top() << " ";
qs1.pop();
}
cout << endl;
return 0;
}
相信小伙伴们对于类似的问题都已经多少掌握了一些套路了吧,加油!