1.使用栈实现队列的下列操作:
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。
#include <bits/stdc++.h>
using namespace std;
class MyQueue
{
public:
stack<int> stIn;
stack<int> stOut;
MyQueue(){}
void push(int x)
{
stIn.push(x);
}
int pop()
{
if(stOut.empty())
{
while(!stIn.empty())
{
stOut.push(stIn.top());
stIn.pop();
}
}
int result=stOut.top();
stOut.pop();
return result;
}
int peak()
{
int res=this->pop();
stOut.push(res);
return res;
}
bool empty()
{
return stIn.empty()&&stOut.empty();
}
};
int main()
{
MyQueue q;
q.push(1);
q.push(2);
q.push(3);
cout<<q.peak()<<endl;
cout<<q.pop()<<endl;
q.push(4);
q.push(6);
q.pop();
while(!q.empty())
{
cout<<q.pop()<<" ";
}
cout<<endl;
cout<<(q.empty()?"是":"否");
return 0;
}
思路:在这里我们·要用栈来实现队列的操作,首先我们先来思考,队列遵循FIFO(先进先出),而栈遵循FILO(先进后出),两者的元素进出顺序可谓是截然不同,如何才能实现呢,这时我们可以想到用2个栈,假设有一个队列,有三个元素1,2,3按顺序进入队列,出去时的顺序仍然是1,2,3,同时有2个栈stIn和stOut,元素先按顺序进入到stIn,然后出来,但是顺序反过来了,变成了3,2,1,这是继续进入到stOut中,当它们再次出栈时,顺序就恢复成了1,2,3,这不就正好是我们想要的结果吗。
2.使用队列实现栈的下列操作:
- push(x) -- 元素 x 入栈
- pop() -- 移除栈顶元素
- top() -- 获取栈顶元素
- empty() -- 返回栈是否为空
#include <bits/stdc++.h>
using namespace std;
class Stack{
public:
Stack(){}
queue<int> que;
void push(int x)
{
que.push(x);
}
int pop()
{
int size=que.size();
size--;
while(size--)
{
que.push(que.front());
que.pop();
}
int result=que.front();
que.pop();
return result;
}
int top()
{
return que.back();
}
bool empty()
{
return que.empty();
}
};
int main()
{
Stack st;
st.push(1);
st.push(2);
st.push(3);
cout<<st.top()<<endl;
cout<<st.pop()<<endl;
while(!st.empty())
{
cout<<st.pop()<<" ";
}
cout<<endl;
cout<<(st.empty()?"Yes":"No");
return 0;
}
思路:在这里我们要用队列实现栈,有的人想当然的就用2个队列来实现,其实也是可以的,但是和1个队列来实现栈操作比起还是显得麻烦了,为什么只需要一个队列就可以呢,因为队列两端与栈两端不同,它两端都不封闭。假设有3个元素1,2,3,按顺序进入到栈,输出时顺序应该为3,2,1,当1,2,3进入到队列时为了让输出的首个元素也为3,我们只能让其余不是3的元素让路,那么我们就要将其弹出,并且回到该队列中,那不就是又让它们从队列入口端进入了吗,这样一来就实现了我们想达到的效果。
另外,其实我们仔细看一下两者栈的第一个元素不就是队列的入口端的第一个元素吗,因此取栈顶元素就是取队列入口端的第一个元素。