先来看栈有什么特性呢?
遵从先进后出的原则,就比如说一个容器,正常情况下,先放进去的当然是后出来了。(FILO)
再来看看队列有什么特性?
队列在我们生活中就类似于排队,比如在在去食堂吃饭的时候就需要排队去买饭,排在前边的人自然先买到饭(FIFO)
清楚了这些基本概念之后,那么如何利用队列实现栈呢?先看下图
大方框里边的小方框(没有闭合)代表一个队列,你可以把它想象成一列正在排队等候打饭的同学,里边有A、B、C同学,外边用一个黑盒子包起来。内部怎么操作外边是看不见的。然后A在最前边,先出来,经过红色的路径,再次排在C的后边,同理B也出来,排在A后边。那么就可以得到下图。
此时在让C先出来,接着B再A,此时就如同栈一样,先入栈的A最后出栈,相反,后入栈的C最先出栈
下面贴出详细代码(leetcode亲测无误哦)
class MyStack {
public:
queue<int> q; //首先定义一个int类型的队列q
/** Initialize your data structure here. */
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {//将元素压入栈中
q.push(x);
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
int size=q.size();//移动size-1个元素,因为最后一个元素不用移动,把前几个元素都移到后边去了,自然最后一个元素就成了第一个
for(int i=0;i<size-1;i++)
{
int v=q.front();
q.pop();//弹出栈后再压入栈
q.push(v);
}
int v=q.front();
q.pop();
return v;
}
/** Get the top element. */
int top() {//返回栈顶元素
int size=q.size();
for(int i=0;i<size-1;i++)
{
int v=q.front();
q.pop();
q.push(v);
}
int v=q.front();
q.pop();
q.push(v);
return v;
}
/** Returns whether the stack is empty. */
bool empty() {
return q.empty();
}
};