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;
}