既然写到这两个题了,我之前的博客也没介绍栈跟队列,就简单的说一说
放在最下面的,如果想要了解栈跟队列的童鞋可以看看我的理解
先say say这两道题
1、两个栈实现一个队列
思路:
这没啥说的,队列特性、先进先出,想办法先拿到黑的
添加元素、入队: 直接添加即可
出队: 将stack1中元素依次出栈,入栈到stack2
此时stack2栈顶元素就是队列第一次进来的元素
这块注意的是,stack2不为空时,才添加元素;否则直接返回stack2栈顶元素
代码:
class MyQueue {
private Stack<Integer> stack1;//入栈
private Stack<Integer> stack2;//出栈
public MyQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void push(int val) {
stack1.push(val);
}
public int pop() {
//模拟队列,s2不为空,直接就出元素
//要是为空就要将s1全部放进s2,目的是为了搞到s1栈底的元素
if (stack2.isEmpty()) {
//将s1中元素全部放入s2中
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
public boolean isEmpty() {
return stack1.isEmpty() && stack2.isEmpty();
}
}
2、两队列实现一栈
思路:
跟栈实现队列差不多,栈、后进先出,想办法先拿到绿的
添加、入栈: 元素放进queue1中
删除、出栈: 先将queue1中元素依次放进queue2中,直到queue1中只剩下一个,拿到(出队),再将queue2中元素又放回queue1中,循环往复
代码:
class MyStack {
private Queue<Integer> queue1;
private Queue<Integer> queue2;
public MyStack() {
queue1 = new ArrayDeque<>();
queue2 = new ArrayDeque<>();
}
public void push(int val) {
queue1.add(val);
}
public int pop() {
while (queue1.size() > 1) {
queue2.add(queue1.poll());
}
int res = queue1.remove();
while (!queue2.isEmpty()) {
queue1.add(queue2.poll());
}
return res;
}
//q2永远为空、q1永不为空
public boolean isEmpty() {
return queue1.isEmpty();
}
}
分割线
栈
栈的特性,“先进后出、后进先出都可以”
栈的底层实现不外乎由数组、由链表实现
所谓的先进后出、后进先出,就是你添加元素的时候,
先添加的元素最后才能拿到,后进来的元素反而第一个出去、被拿到
栈也就是插入删除只在栈顶进行的操作
java
中的 Stack
就是实现好了的栈、数组实现
其中的常用方法
push()
,添加元素、入栈peek()
,得到栈顶元素pop()
,出栈,删除并返回栈顶元素
这也是我没有写过栈跟队列的原因,我的理解实在有限,一些基础的数据结构如链表、栈、队列,多想一想结构,其实懂了的话结构很简单
我第一次学数据结构的时候,链表我也晕晕乎乎的,老师讲栈时那个后进先出一下子让那个我有了那么一点感觉了,然后看顺序表、链表,C语言基础没搞好,还是一言难尽
难道这就是选Java
的接口?
队列
队列的特性,先进先出
先进来的元素第一个会被拿到
队列是可以在队头(删除)队尾(添加)被操作的东西
跟栈不同,java
中的队列Queue
只是一个接口
不要紧,我们看看其中的方法
说实话,有点懵了,学c语言版的数据结构,什么EnQueue、DeQueue
java
无
add()、offer()
,队头添加、入队remove()、poll()
,队尾删除、出队element()、peek()
,得到队头元素
java
中没有写Queue
的方法实现,但是LinkedList
是实现了这个接口的
队列也就是头删、尾添、头出罢了
栈也就是尾添、尾删、尾出罢了
此外还有一种实现了Queue
接口的更好用的java
中的数据结构ArrayDeque
-> 双端队列、循环队列
所以栈跟队列Java中已经不太提倡用了,用链表或双端队列其中一个就都可以实现了。
只要懂的实现思维不就都可以?懂?