- 很经典的一个算法题,既考察了栈的性质,又考察了队列的性质。我们可以定一个stack1,stack2.。入栈的时候直接入到stack1,当出栈的时候,先判断stack2是否为空,为空的话,把stack1顺序出栈压入stack2.然后把stack2栈顶元素弹出。同理取front元素的时候也一样。empty判断直接判断连个栈是否为空,size是两个对战的size相加。代码实现如下:
#include
#include
#include
#include
#include
using namespace std;
template
class MyQueue//先进先出
{
public:
bool empty();
int size();
void push(T val);
void pop();
T front();
private:
stack m_stack1;
stack m_stack2;
};
template
bool MyQueue::empty()
{
return this->m_stack1.empty() && this->m_stack2.empty();
}
template
int MyQueue::size()
{
return this->m_stack1.size() + this->m_stack2.size();
}
template
void MyQueue::push(T val)
{
this->m_stack1.push(val);
}
template
void MyQueue::pop()
{
if (!this->m_stack2.empty())
{
this->m_stack2.pop();
}
else
{
while (!this->m_stack1.empty())
{
T val = this->m_stack1.top();
this->m_stack2.push(val);
this->m_stack1.pop();
}
this->m_stack2.pop();
}
}
template
T MyQueue::front()
{
if (!this->m_stack2.empty())
{
return this->m_stack2.top();
}
else
{
while (!this->m_stack1.empty())
{
T val = this->m_stack1.top();
this->m_stack2.push(val);
this->m_stack1.pop();
}
return this->m_stack2.top();
}
}
int main()
{
MyQueue *Q = new MyQueue();
queue herQ;
srand((unsigned)time(NULL));
for (int i = 0; i < 10; i++)
{
int val = rand() % 100;
herQ.push(val);
Q->push(val);
cout << val << " ";
}
cout << endl;
cout <<"myQ "<size()<<endl;
cout <<"herQ "<< herQ.size() << endl;
cout << "myQ: ";
while (!Q->empty())
{
int val = Q->front();
cout << val << " ";
Q->pop();
}
cout << endl;
cout << "herQ: ";
while (!herQ.empty())
{
int val = herQ.front();
cout << val << " ";
herQ.pop();
}
cout << endl;
system(“pause”);
return 0;
}
我们用了模板类的设计方法,使代码更具有普适性。执行结果如下:
(2)用两个队列实现栈。栈的特点是先进后出。那么我们定义两个q1,q2两个队列,出栈的时候,我们需要知道最后一个元素,那么我们可以把q1一直出队(q2为空),直到它的size为1,那么这个元素就是我们需要的出栈的元素。通过出栈我们可以判断出q1、q2始终有一个队列为空(队列不为空,没法判断那个先那个后)。入栈的操作,q1、q2都为空的时候,我们入队q1,不都为空的时候,我们哪个不为空,入队哪个。实现的代码如下:
#include
#include
#include
#include
#include
using namespace std;
template
class MyStack //先进后出
{
public:
bool empty();
int size();
T top();
void push(T val);
void pop();
private:
queue m_queue1;
queue m_queue2;
};
template
bool MyStack::empty()
{
return this->m_queue1.empty() && this->m_queue2.empty();
}
template
int MyStack::size()
{
return this->m_queue1.size() + this->m_queue2.size();
}
template
void MyStack::push(T val)
{
if (this->m_queue1.empty() && this->m_queue2.empty())//都为空的时候,入队q1。不都为空的时候,哪个不为空,入队哪个
{
this->m_queue1.push(val);
return;
}
else if (!this->m_queue2.empty())
{
this->m_queue2.push(val);
return;
}
else if(!this->m_queue1.empty())
{
this->m_queue1.push(val);
return;
}
}
template
void MyStack::pop()
{
if (this->m_queue2.empty())
{
while (this->m_queue1.size() != 1)//直到size为1,然后这个出队,q1为空
{
T val = this->m_queue1.front();
this->m_queue2.push(val);
this->m_queue1.pop();
}
this->m_queue1.pop();
}
if(this->m_queue1.empty())//直到size为1,然后这个出队,q2为空
{
while (this->m_queue2.size() != 1)
{
T val = this->m_queue2.front();
this->m_queue1.push(val);
this->m_queue2.pop();
}
this->m_queue2.pop();
}
}
template
T MyStack::top()
{
if (this->m_queue2.empty())
{
while (this->m_queue1.size() != 1)//直到size为1,然后这个出队,q1为空
{
T val = this->m_queue1.front();
this->m_queue2.push(val);
this->m_queue1.pop();
}
T val = this->m_queue1.front();
this->m_queue2.push(val);
this->m_queue1.pop();//保留需要展示的队首元素并返回,同时该元素要入队q2,出队q1,保证始终有一个队列为空。下同。
return val;
}
if (this->m_queue1.empty())
{
while (this->m_queue2.size() != 1)
{
T val = this->m_queue2.front();
this->m_queue1.push(val);
this->m_queue2.pop();
}
T val = this->m_queue2.front();
this->m_queue1.push(val);
this->m_queue2.pop();
return val;
}
}
int main()
{
MyStack *myStack = new MyStack();
stack herStack;
srand((unsigned)time(NULL));
for (int i = 0; i < 15; i++)
{
int val = rand() % 100;
herStack.push(val);
myStack->push(val);
cout << val << " ";
}
cout << endl;
cout << "herStack " << herStack.size() << endl;
cout << "myStack: " << myStack->size() << endl;
cout << "herStack: ";
while (!herStack.empty())
{
int val = herStack.top();
cout << val << " ";
herStack.pop();
}
cout << endl;
cout << "myStack: ";
while (!myStack->empty())
{
int val = myStack->top();
cout << val << " ";
myStack->pop();
}
cout << endl;
system(“pause”);
return 0;
}
执行的结果如下图所示: