目录
问题描述:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
实现代码和解析:
使用俩个队列:
class MyStack {
public:
MyStack()
{
}
queue<int> que1;//队列1
queue<int> que2; //队列2
void push(int x)
{
que1.push(x);
}
int pop()
{
int size=que1.size();
size--;
//将队列1除最后一个元素的前面所有元素添加到队列2中
while(size--)
{
que2.push(que1.front());
que1.pop();
}
int result=que1.front();
que1.pop();
//重新将队列2的元素添加到队列1
//这里可以直接=来赋值,然后清空队列2
while(!que2.empty())
{
que1.push(que2.front());
que2.pop();
}
return result;
}
int top()
{
return que1.back();
}
bool empty()
{
if(que1.empty())
{
return true;
}
return false;
}
};
原理思路:
主要讲模拟出栈,先将队列1除最后一个元素的前面所有元素出队且添加到队列2,然后记录队列1的最后一个元素,然后出队,这个值就是模拟的出栈元素,然后将队列2的元素从重新添加到队列1,可以直接赋值,然后清空队列2。写这道题的时候可以和上一题用栈实现队列对应着记忆和理解,看看他们实现的不同之处,以及要知道这么写的原因,相对还是非常简单的,可以用几个例子自己模拟一下。
使用一个队列:
class MyStack {
public:
MyStack() {
}
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()
{
if(que.empty())
{
return true;
}
return false;
}
};
原理思路:
此方法与用两个队列的方法相似,这里就是重新把所需出队列元素的前面所有元素重新添加到自身队列中,这个步骤相当于代替了上一个方法中的第二个队列,还是比较好理解的,就不详细解释了。