棧實現隊列,隊列實現棧

棧實現隊列:

思想:是有兩個棧,一個用來放數據(數據棧),一個用來輔助(輔助棧)。數據添加時,會依次壓人棧,取數據時肯定會取棧頂元素,但我們想模擬隊列的先進先出,所以就得取棧底元素,那麼輔助棧就派上用場了,把數據棧的元素依次彈出到輔助棧,但保留最後一個元素,最後數據棧就剩下了最後一個元素,直接把元素返回,這時數據棧已經沒有了數據。最後呢,把輔助棧的元素依次壓人數據棧,這樣,我們成功取到了棧底元素。

代碼如下:

class Queue
{
public:
	void push(int data)//入棧時,無論兩個棧是什麼情況,都只往s1中入
    {
		s1.push(data);
    }
	int pop()
	{
		if(s1.empty() && s2.empty())
        {
            cout << "The queue is empty";
        }
        if (!s2.empty()) 
        {
           int val = s2.top();
		   s2.pop();
		   return val;
        }
        else
        {
            while (!s1.empty())
            { 
                s2.push(s1.top());
                s1.pop();
            }
        }
	}
private:
	stack<int> s1;
	stack<int> s2;
};

隊列實現棧:

思想:有數據隊列和輔助隊列,模擬棧的先進後出,隊列是隊尾進隊頭出,也就是說每次取值要取隊列的隊尾元素,數據隊列出隊到輔助隊列,留下最後一個元素返回,輔助隊列再把元素出隊到數據隊列

代碼如下:

class stack
{
public:
	void push(int data)  //保證任何時候只有一個隊列中有元素
	{
		if(q1.empty() && q2.empty())
		{
			q1.push(data);
		}
		if(q1.empty() && !q2.empty())
		{
			q2.push(data);
		}
		if(!q1.empty() && q2.empty())
		{
			q1.push(data);
		}
	}
	int pop()
	{
		int val;
		if(q1.size() != 0)//處理q1的元素
		{
			while(q1.size() > 1)//非空隊列中除最後一個元素入另一個隊,最後一個元素出隊,相當於出棧
			{		
				q2.push(q1.front());
				q1.pop();
			}
			val = q1.front();
			q1.pop();
		}
		else //處理q2的元素
		{
			while(q2.size() > 1)
			{		
				q1.push(q2.front());
				q2.pop();
			}
			val = q2.front();
			q2.pop();
		}
		return val;
	}
private:
	queue<int> q1;
	queue<int> q2;
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章