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