题目:用两个队列实现一个栈。实现两个函数push和pop,完成从栈顶插入和删除结点的功能。
思路:
(1)入栈:总是插入到非空队列中
(2)出栈:将非空队列中的前n-1个元素依次出队列push进空队列中,然后将最后一个元素出队列,完成出栈操作。
?
C++代码:
?
#include "stdafx.h"
#include
#include
#include
using namespace std;
// 两个队列实现一个栈
template
class CStack
{
public:
CStack() {}
~CStack() {}
void PushData(const T& element);
void PopData(T& element);
private:
deque m_queue1;
deque m_queue2;
};
template
void CStack::PushData(const T& element)
{
if (m_queue1.size() > 0)
{
m_queue1.push_back(element);
}
else if (m_queue2.size() > 0)
{
m_queue2.push_back(element);
}
else
{
m_queue1.push_back(element);
}
}
template
void CStack::PopData(T& element)
{
if (m_queue1.size() == 0)
{
while (m_queue2.size() > 1)
{
T& data = m_queue2.front();
m_queue2.pop_front();
m_queue1.push_back(data);
}
assert(m_queue2.size() == 1); //确保队列2内有一个元素
element = m_queue2.front();
m_queue2.pop_front();
}
else if (m_queue2.size() == 0)
{
while (m_queue1.size() > 1)
{
T& data = m_queue1.front();
m_queue1.pop_front();
m_queue2.push_back(data);
}
assert(m_queue1.size() == 1); //确保队列1内有一个元素
element = m_queue1.front();
m_queue1.pop_front();
}
}
int main()
{
CStack myStack;
int nPopData = 0;
myStack.PushData(1);
myStack.PushData(2);
myStack.PushData(3);
myStack.PopData(nPopData);
cout << nPopData << endl;
myStack.PushData(4);
myStack.PopData(nPopData);
cout << nPopData << endl;
system("pause");
return 0;
}
#include "stdafx.h"
#include
#include
#include
using namespace std;
// 两个队列实现一个栈
template
class CStack
{
public:
CStack() {}
~CStack() {}
void PushData(const T& element);
void PopData(T& element);
private:
deque m_queue1;
deque m_queue2;
};
template
void CStack::PushData(const T& element)
{
if (m_queue1.size() > 0)
{
m_queue1.push_back(element);
}
else if (m_queue2.size() > 0)
{
m_queue2.push_back(element);
}
else
{
m_queue1.push_back(element);
}
}
template
void CStack::PopData(T& element)
{
if (m_queue1.size() == 0)
{
while (m_queue2.size() > 1)
{
T& data = m_queue2.front();
m_queue2.pop_front();
m_queue1.push_back(data);
}
assert(m_queue2.size() == 1); //确保队列2内有一个元素
element = m_queue2.front();
m_queue2.pop_front();
}
else if (m_queue2.size() == 0)
{
while (m_queue1.size() > 1)
{
T& data = m_queue1.front();
m_queue1.pop_front();
m_queue2.push_back(data);
}
assert(m_queue1.size() == 1); //确保队列1内有一个元素
element = m_queue1.front();
m_queue1.pop_front();
}
}
int main()
{
CStack myStack;
int nPopData = 0;
myStack.PushData(1);
myStack.PushData(2);
myStack.PushData(3);
myStack.PopData(nPopData);
cout << nPopData << endl;
myStack.PushData(4);
myStack.PopData(nPopData);
cout << nPopData << endl;
system("pause");
return 0;
}
?