题目:用两个队列实现一个栈。实现两个函数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; }
?