请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
说明:
- 你 只能 使用标准的栈操作 —— 也就是只有
push to top
,peek/pop from top
,size
, 和is empty
操作是合法的。 - 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
思路:
注意对于将进栈元素出到出栈中实现反转时,一定要把全部元素都出栈保证次序一致
代码如下:
class MyQueue {
private Stack put;
private Stack out;
public MyQueue() {
put= new Stack<>();
out = new Stack<>();
}
public void push(int x) {
put.push(x);
}
public int pop() {
Object temp;
//出口栈为空的话则把入口栈的数据全部放进出口栈后再进行出栈
if(out.empty()){
while(!put.empty()){
temp = put.pop();
out.push(temp);
}
}
return (int)out.pop();
}
public int peek() {
Object temp;
//出口栈为空的话则把入口栈的数据全部放进出口栈后再进行出栈
if(out.empty()){
while(!put.empty()){
temp = put.pop();
out.push(temp);
}
}
return (int)out.peek();
}
public boolean empty() {
if(put.empty()&&out.empty()){
return true;
}
return false;
}
}
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
注意:
- 你只能使用队列的基本操作 —— 也就是
push to back
、peek/pop from front
、size
和is empty
这些操作。 - 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
思路:
本题只需要一个队列足矣,因为把队列前size-1个元素出列又入列后,剩下一个元素便是最后入列的元素,此时将该元素出列便可实现出栈的操作
获取栈顶元素要注意,在取到最后一个元素后别忘了再将其出列入列,以回复队列或者说模拟栈 的初始状态
代码如下
class MyStack {
private Queue<Integer> queue;
public MyStack() {
//创建一个队列
queue = new LinkedList<>();
}
public void push(int x) {
queue.add(x);
}
public int pop() {
//将size-1个元素出列后重新入列,实现将队列里的最后一个元素出列
lastElement();
return queue.poll();
}
public int top() {
lastElement();
Integer temp;
temp = queue.poll();
queue.add(temp);
return temp;
}
public void lastElement(){
if(empty())
return;
Integer temp;
for (int i = 0; i < queue.size()-1; i++) {
temp = queue.poll();
queue.add(temp);
}
}
public boolean empty() {
if(queue.size() ==0){
return true;
}
return false;
}
}
这就是本次训练的题目,感谢大家的观看!