利用棧實現隊列and利用隊列實現棧

 1、使用兩個棧實現一個隊列

    棧:LIFO  後入先出

    隊列:FIFO  先入先出

取隊列頭部front的思路:入棧A順序依次爲先後7-8-9-10;隊列的頭部front應該爲7,對應的是棧A的棧底7,爲了能利用棧的top取出7,必須利用棧B的輔助,先將棧A的所有元素都彈出壓入棧B,實現數字7成爲棧B的棧頂top,直接利用棧B的棧頂top即可取出隊列頭部front 7。其他隊列操作函數思路類似,可參考下面代碼。

 

// 使用兩個stack棧實現queue隊列的功能
#include <iostream>
using namespace std;
#include <stack>

class Myqueue
{
public:
	Myqueue() {}

	void push(int data)
	{
		_dataA.push(data);
	}

	void pop()  
	{
		if (_dataB.empty())
		{
			while (!_dataA.empty())
			{
				_dataB.push(_dataA.top());
				_dataA.pop();
			}
		}
		_dataB.pop();
	}

	int front()
	{
		if (_dataB.empty())
		{
			while (!_dataA.empty())
			{
				_dataB.push(_dataA.top());
				_dataA.pop();
			}
		}
		return _dataB.top();
	}

	int back()
	{
		if (_dataA.empty())
		{
			while (!_dataB.empty())
			{
				_dataA.push(_dataB.top());
				_dataB.pop();
			}
		}
		return _dataA.top();
	}
	
	bool empty()
	{
		return _dataA.empty() && _dataB.empty();
	}

	int size()
	{
		return _dataA.size() + _dataB.size();
	}

private:
	stack<int> _dataA;  // 棧A
	stack<int> _dataB;  // 棧B
};

int main() {

	Myqueue q;
	q.push(7);
	q.push(8);
	q.push(9);
	q.push(10);
	cout << "" << q.front() << endl;
	cout << "" << q.back() << endl;
	cout << "" << q.empty() << endl;
	cout << "" << q.size() << endl;
	cout << "******" << endl;
	q.pop();
	cout << "" << q.front() << endl;
	cout << "" << q.empty() << endl;
	cout << "" << q.size() << endl;
	cout << "******" << endl;
	q.pop();
	cout << "" << q.front() << endl;
	cout << "" << q.empty() << endl;
	cout << "" << q.size() << endl;
	cout << "******" << endl;
	q.pop();
	cout << "" << q.front() << endl;
	cout << "" << q.empty() << endl;
	cout << "" << q.size() << endl;

	system("pause");

	return 0;
}

 

  2、使用兩個隊列實現一個棧

// 使用queue隊列實現stack棧的功能
#include <iostream>
using namespace std;
#include <queue>
class MyStack
{
public:
	MyStack() {}

	void push(int temp)
	{
		queue<int> temp_queue;
		temp_queue.push(temp);  // 創建臨時隊列QA,輔助實現棧的功能
		while (!_data.empty())
		{
			temp_queue.push(_data.front());
			_data.pop();
		}
		while (!temp_queue.empty())
		{
			_data.push(temp_queue.front());
			temp_queue.pop();
		}
	}

	int pop()  // 彈出棧頂元素,並返回棧頂元素
	{
		int temp = _data.front();
		_data.pop();
		return temp;
	}

	int top()
	{
		return _data.front();
	}
	
	bool empty()
	{
		return _data.empty();
	}

private:
	queue<int> _data;  // 隊列QB
};

int main() {
	MyStack q;  //使用queue隊列實現stack棧的功能
	q.push(7);
	q.push(8);
	cout << "" << q.pop() << endl;
	cout << "" << q.top() << endl;

	system("pause");

	return 0;
}

 

 

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