C/C++面試題—使用STL兩個佇列實現一個棧
阿新 • • 發佈:2018-12-31
題目介紹
使用STL中的兩個佇列實現一個棧,實現棧的top、pop、push、clear等操作。
思路分析
思路和使用2個棧實現一個佇列是相通的,用一個佇列queue1容器用來 壓棧,出棧的時候判斷queue1.size()是否大於1,大於1的話隊尾元素是棧頂需要彈出,這時就用到了queue2,將queue1其他的元素倒騰到queue2中,queue1中剩下的那一個元素就是棧頂的元素了。下次再繼續出棧,如果queue1中沒有元素 就判斷queue2中的元素,queue2的隊尾為棧頂,將其他元素倒騰到queue1中。
程式碼展示
/*
使用STL,用兩個佇列來實現一個棧,完成棧的push,pop,top,clear
*/
#include <queue>
#include <stack>
#include <iostream>
using namespace std;
template<typename T> class MyStack
{
public:
void clear()
{
if (queue1.size() > 0)
queue1.swap(queue<T>());
if (queue2.size() > 0)
queue2.swap(queue <T>());
}
T top() //棧頂就是 佇列的最後一個元素,和pop函式十分類似
{
while (queue1.size() > 1)//queue1的隊尾元素是棧頂元素,將其餘的倒騰到queue2中去
{
T front = queue1.front();
queue1.pop();
queue2.push(front);
}
if (queue1.size() == 1)
{
T front = queue1.front();
//queue1.pop();
return front;
}
while (queue2.size() > 1)//queue1沒有元素,queue2有元素,queue2的隊尾為棧頂元素,將其餘的倒騰到queue1中去
{
T front = queue2.front();
queue2.pop();
queue1.push(front);
}
if (queue2.size() == 1)
{
T front = queue2.front();
//queue2.pop();
return front;
}
throw std::exception("queue is empty");
}
void push(T data) //壓棧
{
queue1.push(data);
}
T pop() //將棧頂元素彈出
{
while (queue1.size() > 1)//queue1的隊尾元素是棧頂元素,將其餘的倒騰到queue2中去
{
T front = queue1.front();
queue1.pop();
queue2.push(front);
}
if (queue1.size() == 1)
{
T front = queue1.front();
queue1.pop();
return front;
}
while (queue2.size() > 1)//queue1沒有元素,queue2有元素,queue2的隊尾為棧頂元素,將其餘的倒騰到queue1中去
{
T front = queue2.front();
queue2.pop();
queue1.push(front);
}
if (queue2.size() == 1)
{
T front = queue2.front();
queue2.pop();
return front;
}
throw std::exception("queue is empty");
}
private:
queue<T> queue1; //用來壓棧
queue<T> queue2; //輔助容器
};
int main(int argc, char *argv[])
{
MyStack<int> stack;
stack.push(1);
stack.push(2);
stack.push(3);
int top = stack.top();//3
cout << "top = " << top << endl; //3
int n1 = stack.pop();
int n2 = stack.pop();
top = stack.top();
cout << "top = " << top << endl; //1
int n3 = stack.pop();
cout << n1 << " "<< n2 << " " << n3 << endl; //入棧 1 2 3 ->出棧 3 2 1
stack.clear();
stack.push(100);
stack.push(200);
stack.push(300);
n1 = stack.pop();
n2 = stack.pop();
n3 = stack.pop();
cout << n1 << " " << n2 << " " << n3 << endl; //入棧 100 200 300 ->出棧 300 200 100
return 0;
}