用两个栈实现队列
题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
思路分析
使用栈来实现队列,涉及到了2种常见的数据结构,即栈和队列;栈具有后进先出的特点,而队列具有先进先出的特点。而题目指明使用2个栈来实现,实际就已经给出了我们解决的办法,即首先将数据入栈1,再将栈1中的数据按出栈的顺序入栈2,其实就达到了先进的先出的效果;但是需要注意的就是栈1的数据入栈2时的一些条件判断。
代码实现
import java.util.Stack;
class CQueue {
//定义2个栈
private Stack<Integer> Stack1;
private Stack<Integer> Stack2;
public CQueue() {
//2个栈来实现队列
Stack1=new Stack<>();
Stack2=new Stack<>();
}
/*
* 在尾部插入元素
* 直接插入即可
* */
public void appendTail(int value) {
Stack1.push(value);
}
/*
* 删除队头元素
* */
public int deleteHead() {
if (!Stack2.empty()){
return Stack2.pop();
}else{
Stack2.push(Stack1.pop());
}
if (!Stack2.empty()){
return Stack2.pop();
}else{
//此处实际是栈1栈2都为空了
return -1;
}
}
}
关于删除队头元素的实现,实则就是依靠从栈2中出元素来实现,而栈2的元素是由栈1出元素再入栈2得到的,主要有3种情况:
- 栈2为空时,需要从栈1中出元素到栈2;
- 栈2不为空时,直接栈2出元素即可;
- 栈1栈2都为空,返回-1;
包含min函数的栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
思路分析
实现栈的方式其实有很多,但是这道题的官方题解是使用辅助栈来实现了栈,也确实要更加简便一些,所以,用栈来实现栈,en…也没什么问题;
使用2个栈A和B,栈B来记录入栈A的最小值,当入栈A的元素小于当前栈B的值时,将该值同时入栈B,相当于更新了当前栈的最小值;
代码实现
import java.util.Stack;
class MinStack {
Stack<Integer> A,B;
/** initialize your data structure here. */
public MinStack() {
A=new Stack<>();
B=new Stack<>();
}
/*
* 入栈
* */
public void push(int x) {
A.push(x);
if (B.empty()||x<B.peek()){
B.push(x);
}
}
/*
* 出栈
* */
public void pop() {
int a=A.pop();
if (a==B.peek()){
B.pop();
}
}
/*
* 返回栈顶元素
* */
public int top() {
return A.peek();
}
/*
* 返回栈中元素的最小值
* */
public int min() {
return B.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
over!