栈和队列有什么区别呢?
栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素的操作。栈中的数据元素遵守后进先出的原则。如图,栈顶的元素先出栈,最后出栈的元素是最先进入栈的元素。
队列也是一种特殊的线性表,但是,只允许在一端插入数据,另一端删除数据。队列的数据元素遵守先进先出的原则。进行插入操作的一端称为队尾,进行删除操作的一端称为对头。
例题1:用两个队列实现一个后入先出的栈
两个队列,queue1用于存储栈内的元素,queue2作为入栈操作的辅助队列。入栈时,首先将元素入栈到queue2,然后将queue1的全部元素依次出队,并入队道queue2,此时queue2的前端元素即为新入栈的元素。然后,将queue1和queue2互换,这样,queue1的元素就为栈内的元素,queue1的前端和后端分别对应栈顶和栈底。
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
//初始化两个队列的数据结构
public MyStack() {
queue1 = new LinkedList<Integer>();
queue2 = new LinkedList<Integer>();
}
//将元素x入栈到栈中
public void push(int x) {
queue2.offer(x);//将元素入栈到queue2
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());//将queue1中的元素出队,入栈到queue2中
}
Queue<Integer> temp = queue1;//将queue2中的全部元素入栈到queue1
queue1 = queue2;
queue2 = temp;
}
//将栈顶的元素删除,并返回该值
public int pop() {
return queue1.poll();
}
//获得栈顶的元素
public int top() {
return queue1.peek();
}
//栈中是否为空
public boolean empty() {
return queue1.isEmpty();
}
}
例题2:用两个栈实现先入先出的队列
两个栈,一个作为输入栈,另一个作为输出栈。每次出栈或查看栈顶元素时,若输出栈为空,就将输入栈的全部元素弹出,并入栈到输出栈。这样,输出栈从栈顶往栈底的顺序,即为队列从队首往队尾的顺序。
class MyQueue {
Deque<Integer> inStack;
Deque<Integer> outStack;
public MyQueue() {//初始化两个栈
inStack = new ArrayDeque<Integer>();
outStack = new ArrayDeque<Integer>();
}
public void push(int x) {
inStack.push(x);
}
public int pop() {
if (outStack.isEmpty()) {//如果输出栈为空,则将输入栈的全部元素弹出,入栈到输出栈
in2out();
}
return outStack.pop();
}
public int peek() {//查看拿到栈顶元素
if (outStack.isEmpty()) {
in2out();
}
return outStack.peek();
}
public boolean empty() {
return inStack.isEmpty() && outStack.isEmpty();
}
private void in2out() {
while (!inStack.isEmpty()) {//如果输入栈不为空,则将全部元素入栈到输出栈
outStack.push(inStack.pop());
}
}
}