在计算机科学中,栈是一种数据结构,它遵循后进先出(LIFO)的原则。这意味着最后一个被添加到栈的元素将是第一个被移除的元素。然而,Java的标准库并没有提供栈的实现,但我们可以使用两个队列来模拟一个栈的行为。
首先,我们需要创建一个名为MyStack
的类,该类包含两个栈:queue1
和queue2
。这两个栈将用于实现队列的功能。接下来,我们需要实现队列的基本操作,包括push
、pop
、peek
和empty
。
首先,我们需要创建一个栈类
public class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack(){
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
}
push方法
push(int value)
: 将一个元素添加到栈中。首先,我们将该元素添加到queue2
中。然后,我们将queue1
中的所有元素移动到queue2
中,直到queue1
为空。最后,我们交换queue1
和queue2
的角色,使得queue1
始终是栈顶元素所在的队列。
public void push(int value){
queue2.offer(value);
while (!queue1.isEmpty()){
queue2.offer(queue1.poll());
}
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
pop方法
pop()
: 从栈中移除并返回栈顶元素。由于栈顶元素位于queue1
中,我们只需调用queue1.poll()
即可。
public int pop(){
return queue1.poll();
}
top()方法
top()
: 返回栈顶元素但不将其从栈中移除。由于栈顶元素位于queue1
中,我们只需调用queue1.peek()
即可。
public int top(){
return queue1.peek();
}
isEmpty方法
isEmpty()
: 检查栈是否为空。我们只需检查queue1
是否为空即可。
public boolean isEmpty(){
return queue1.isEmpty();
}
完整代码
public class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack(){
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
public void push(int value){
queue2.offer(value);
while (!queue1.isEmpty()){
queue2.offer(queue1.poll());
}
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int pop(){
return queue1.poll();
}
public int top(){
return queue1.peek();
}
public boolean isEmpty(){
return queue1.isEmpty();
}
}
测试类
public class Test {
public static void main(String[] args) {
MyStack myStack = new MyStack();
System.out.println(myStack.isEmpty()); // true
myStack.push(1);
myStack.push(2);
myStack.push(3);
System.out.println(myStack.pop()); // 3
System.out.println(myStack.pop()); // 2
System.out.println(myStack.isEmpty()); // false
System.out.println(myStack.pop()); // 1
System.out.println(myStack.isEmpty()); // true
}
}
运行结果