程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 面試題7:用兩個隊列實現棧

面試題7:用兩個隊列實現棧

編輯:C++入門知識

題目:用兩個隊列實現一個棧。實現兩個函數push和pop,完成從棧頂插入和刪除結點的功能。


思路:

(1)入棧:總是插入到非空隊列中

(2)出棧:將非空隊列中的前n-1個元素依次出隊列push進空隊列中,然後將最後一個元素出隊列,完成出棧操作。

 


C++代碼:

 

#include "stdafx.h"   
#include <iostream>   
#include <deque>   
#include <assert.h>   
using namespace std;  
  
// 兩個隊列實現一個棧   
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); //確保隊列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<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>
#include <assert.h>
using namespace std;

// 兩個隊列實現一個棧
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); //確保隊列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<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;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved