一:用队列实现栈
这是该题的链接:225. 用队列实现栈 - 力扣(LeetCode)
栈的特点是:先入后出,而队列的特点是先入先出。故要模拟实现出栈的特点,那么使队列的前面表示栈的后面。也就是说让栈后面进的元素,先进队列。
模拟实现步骤:
QQ录屏20230730160745
步骤1:
当栈入元素1时,队列2进元素1,此时队列1为空。判断队列1是否为空,为空则不用把队列1 的值接到队列2后面。交换队列1与队列2的值。
步骤2:
当栈再次入元素2时,队列2进元素2,此时队列1的元素为1。队列1 不为空,则把队列1的值依次接到队列2后面。接完后,交换队列1与队列2.
步骤3:
当栈再次入元素3时,队列2进元素3,此时队列1的元素为2,1。队列1 不为空,则把队列1的值依次接到队列2后面。接完后,交换队列1与队列2.、
经过这三个步骤后,栈里的数据有3,2,1(从顶到底),队列1的元素有 3,2,1。队列2为空。
这样就实现了栈的模拟。那么此时,栈的top(),也就是队列1的front()。
代码:
class MyStack {
public:
MyStack() {
}
void push(int x)
{
q2.push(x);
while (!q1.empty())
{
q2.push(q1.front());
q1.pop();
}
swap(q1, q2);
}
int pop()
{
int t = q1.front();
q1.pop();
return t;
}
int top()
{
int r = q1.front();
return r;
}
bool empty()
{
return q1.empty();
}
queue<int> q1;
queue<int> q2;
};
二:用栈实现队列
栈的特点是:先入后出,而队列的特点是先入先出。故要模拟实现出队列的特点。则要使先入队列的元素,在栈的顶部。
模拟实现步骤:
一个队列(q),两个栈(st1,st2),st1作为输入,st2作为输出。
步骤1:
q进入元素1,2,3,4。st1依次压入1,2,3,4。此时st1里面元素是4,3,2,1(从顶到底)。
步骤2:
q 去掉一个元素,变为2,3,4。则我们将st1的元素依次取出来放到st2里面去。则st1为空,st2里面的元素为1,2,3,4(从顶到底)。此时我们去掉元素1,就很简单,st2.pop()一下就好了。
步骤3:
q进入一个元素9,变为2,3,4,9。st1压入9,此时st1里面的元素只有9。而st2里面的元素有2,3,4。若q要去除一个元素,我们可以发现只需要动st2,q加入元素,我们动st1。若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。
代码:
class MyQueue {
public:
MyQueue() {
}
void push(int x)
{
instack.push(x);
}
void exchange()
{
while (!instack.empty())
{
outstack.push(instack.top());
instack.pop();
}
}
int pop()
{
if (outstack.empty())
{
exchange();
}
int x = outstack.top();
outstack.pop();
return x;
}
int peek()
{
if (outstack.empty())
{
exchange();
return outstack.top();
}
return outstack.top();
}
bool empty()
{
return instack.empty() && outstack.empty();
}
private:
stack<int> instack;
stack<int> outstack;
};