Question: Use two queues to implement one stack. Implement two functions: push and pop to complete the function of inserting and deleting nodes from the top of the stack.
Ideas:
(1) inbound Stack: Always inserted into non-empty queues
(2) Out-of-Stack: push the first n-1 elements in a non-empty queue into the empty queue in sequence, and then exit the last element from the queue to complete the out-of-stack operation.
C ++ code:
# Include "stdafx. h "# include <iostream> # include <deque> # include <assert. h> using namespace std; // two queues implement one stack template <class T> class CStack {public: CStack (){}~ CStack () {} void PushData (const T & element); void PopData (T & element); private: deque <T> m_queue1; deque <T> m_queue2 ;}; template <class T> void CStack <T>: 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 <class T> void CStack <T> :: 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); // ensure that there is an element in queue 2 = 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 ); // Ensure that there is an element in queue 1 = m_queue1.front (); m_queue1.pop_front () ;}} int main () {CStack <int> 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 <iostream> # include <deque> # inc Lude <assert. h> using namespace std; // two queues implement a stack template <class T> class CStack {public: CStack (){}~ CStack () {} void PushData (const T & element); void PopData (T & element); private: deque <T> m_queue1; deque <T> m_queue2 ;}; template <class T> void CStack <T>: 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 <class T> void CStack <T> :: 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); // ensure that there is an element in queue 2 = 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); // ensure that there is an element in queue 1 = m_queue1.front (); m_queue1.pop_front () ;}} int main () {CStack <int> 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 ;}