序言
hello,大家好,今天我们聊一聊栈和队列,大二学数据结构时候,第一次接触到栈和队列,不知不觉到现在两年时间了,不得不感叹一句时间如流水,青春不回头啊~
栈和队列的概念
栈
栈,是一种后进先出的数据结构,上图看一下
可以看到对于先进来的元素是压入栈底的,后进来的元素则放到栈顶,出栈时先出栈顶元素,这样就可以构成后进先出的数据结构了。
队列
队列,是一种先进先出的数据结构,上图~
将1,2,3元素依次入队,队头元素为1,队尾元素为3,出队时先出队头元素,对于后入队的元素将其放置到队尾即可。
用栈实现队列
这道题是leetcode上的原题,我们一起来做一下。
思路分析
要求用栈数据结构来实现队列,也就是说通过后进先出的数据结构实现先进先出。对于元素1,2,3,出队的顺序是1,2,3,出栈的顺序是3,2,1,那么再将出栈的元素入栈,栈中元素就是3,2,1,再出栈的话结果就和最开始出队的顺序一样了,为1,2,3,由此我们可以用两个栈来实现队列。
代码
class MyQueue {
private Stack<Integer> stack1;
private Stack<Integer> stack2;
public MyQueue() {
//栈1
stack1 = new Stack<Integer>();
//栈2
stack2 = new Stack<Integer>();
}
public void push(int x) {
//先将元素存入栈1
stack1.push(x);
}
public int pop() {
if (stack1.isEmpty() && stack2.isEmpty()) {
return -1;
}
if (stack2.isEmpty()) {
//将栈1中的元素重新压栈到栈2,调换顺序
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
public int peek() {
if (stack1.isEmpty() && stack2.isEmpty()) {
return -1;
}
if (stack2.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
return stack2.peek();
}
public boolean empty() {
return stack1.isEmpty() && stack2.isEmpty();
}
}
用队列实现栈
这道题也是leetcode上的原题
思路分析
和上题一样,我们先假设已有元素123,出栈的顺序是321,出队的顺序是123,和上题不同的是即使我们让其再入队再出队顺序依旧是123,所以我们需要换一种思路,我们可以用一个队列来保存之前存放的元素,另一个队列存放刚入队的元素,然后将第一个队列的元素添加到第二个队列当中,让它的顺序颠倒,出队时也就可以达到321的效果了。
代码
class MyStack {
private Queue<Integer> queue1;
private Queue<Integer> queue2;
public MyStack() {
//队列1
queue1 = new LinkedList<>();
//队列2
queue2 = new LinkedList<>();
}
public void push(int x) {
queue1.offer(x);
//队列2的元素都添加到队列1,反转顺序
while (!queue2.isEmpty()) {
queue1.offer(queue2.poll());
}
//交换1,2的位置,让队列1中的元素使用为null
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int pop() {
if (empty()) {
return -1;
}
return queue2.poll();
}
public int top() {
if (empty()) {
return -1;
}
return queue2.peek();
}
public boolean empty() {
return queue2.isEmpty();
}
}
结尾
最近疫情有严重起来了,希望大家都能保护好自己o( ̄︶ ̄)o