使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。
栈的原理是:先进后出;
队的原理是:先进先出.
思路:可以考虑用一个栈保存数据即直接push,出栈时将该栈的数据导入另一个栈,在后者中完成出栈,直接pop(此时后者的栈顶元素已经是队首元素),peek与pop同理,empty直接判定两站是否为空即可.
package Test;
import java.util.Stack;
public class myQueue {
private Stack<Integer> stack1 = new Stack<>(); //将数据存入stack1中
private Stack<Integer> stack2 = new Stack<>(); //辅助输出获取数据
/** Push element x to the back of queue. */
public void push(int x) {
//若stack2不为空
while(!stack2.isEmpty()){
int ret = stack2.pop();
stack1.push(ret);
}
stack1.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public Integer pop() {
//处理对为空队情况
if (stack1.isEmpty() && stack2.isEmpty()){
return null;
}
//若stack2不为空
if (!stack2.isEmpty()){
return stack2.pop();
}
//将stack1中的数据导入stack2
while(!stack1.isEmpty()){
int ret = stack1.pop();
stack2.push(ret);
}
//队首元素元素出队,并返回
return stack2.pop();
}
/** Get the front element. */
public Integer peek() {
//处理队为空的情况
if (stack1.isEmpty() && stack2.isEmpty()){
return null;
}
//若stack2不为空
if (!stack2.isEmpty()){
return stack2.peek();
}
//若stack1不为空
while (!stack1.isEmpty()){
int ret = stack1.pop();
stack2.push(ret);
}
//返回队首元素
return stack2.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return stack1.isEmpty() && stack2.isEmpty();
}
}