开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18 天,点击查看活动详情
我们都知道栈是先入后出,队列是先入先出,那么能不能用栈实现队列?该用什么数据结果实现栈?
用两个栈,实现队列
基础:栈只允许在表尾(栈顶)进行插入和删除。队列是在表尾(队尾)进行插入,表头进行删除。
他们两个都是操作搜现在的线性表。
首先,了解一下思路
假设我们加入数据顺序是 1 2 3 4 5,如果是队列,弹出顺序应该是:1 2 3 4 5.如果是栈,弹出顺序应该是5 4 3 2 1。那么我们把5 4 3 2 1按照顺序放入另外一个栈,那么另外一个栈弹出顺序 1 2 3 4 5.
那么代码如何书写呢?
先对栈1进行push操作,当所有元素都加入后,对他进行出栈,并且报错出栈元素,把这个元素加入栈2.最好对栈2进行弹出。因为模拟的队列,所以只有两个方法,一个加入,一个删除。
怎么把第一个栈内容取出,放入第二个栈?stack2.push(stack1.pop())
第一个栈取出的最后一个元素,就是第二个栈的栈底,也就是队列的头部,自己弹出。
声明栈:Stack<Integer> stack=new Stack<Integer>
加入队列:
public int push(int node){
stack1.push(node);
}
删除队列
public int pop(){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
int res=stack2.pop();
while(!stack2.isEmpty){
stack1.push(stack2.pop);
}
return res;
}
因为栈是操作受限制的线性表,线性表实现是数组,那么栈实现也是数组,所以可以通过动态数组实现堆栈结构
首先,声明一个list集合,push就是直接往list集合里面添加数。出栈,就是list集合的remove(int i)。
在这里,我们需要县第一栈的接口,接口里面有xx方法。然后新建一个类,实现这个接口,并且实现接口里面方法
@Override
public void push(E e) {
array.addLast(e);
}
@Override
public E pop() {
return array.removeLast();
}
@Override
public E peek() {
return array.getLast();
}
和栈相关的:包含min函数的栈
其实就是在栈里面新加一个min方法
- 使用栈1记录进入栈的元素,正常进行push、pop、top操作。
- 使用栈2记录每次push时候进入的最小值。
- 每次push元素的时候与第二个栈的栈顶元素比较,若是较小,则进入第二个栈,若是较大,则第二个栈的栈顶元素再次入栈,因为即便加了一个元素,它依然是最小值。于是,每次访问最小值即访问第二个栈的栈顶。
关键是怎么写push
先正常往stack1添加数据,如果这个时候stack2是空,或者stack2的栈顶元素比加入值大,那么就需要跟新最小值,加入stack2.否则最小值不变,复制入栈
public void push(int node) {
stack1.push(node);
if(stack2.isEmpty()||stack2.peek()>node){
stack2.push(node);
}else{
stack2.push(stack2.peek());
}
}