目录
对Java中栈和队列的常用API做个整理,适合初学者~
栈
Stack是个实现类
入栈
class Test{
public static void main(String[] args){
Stack<Integer> s=new Stack<>();
//push方法的返回值为压入栈的元素
s.push(1);
}
}
查看栈顶元素
class Test{
public static void main(String[] args){
Stack<Integer> s=new Stack<>();
s.push(1);
s.push(2);
s.push(3);
//栈中元素的顺序为:栈顶 3,2,1 栈底
//如果栈为空,调用peek()方法会抛出EmptyStackException异常
Integer peek = s.peek();
System.out.println(peek);
//结果为3
}
}
判断栈是否为空
因此最好在调用peek()之前调用empty()方法判断栈是否为空
class Test{
public static void main(String[] args){
Stack<Integer> s=new Stack<>();
s.push(1);
s.push(2);
s.push(3);
//栈中元素的顺序为:栈顶 3,2,1 栈底
//如果栈为空,调用peek()方法会抛出EmptyStackException异常
//调用empty()方法
if(!s.empty()){
Integer peek = s.peek();
System.out.println(peek);
//结果为3
}
}
}
出栈
pop()方法的返回值为弹出的栈顶元素
class Test{
public static void main(String[] args){
Stack<String> s=new Stack<>();
s.push("b");
s.push("m");
s.push("a");
String pop = s.pop();
System.out.println(pop);//结果: a
System.out.println(s.peek()); //结果: m
}
}
栈Stack实际上继承了Ventor,而Ventor实现了List,所以List的API栈都可以用。
通过增强for循环遍历可以发现,Stack实际上是每次从列表的尾部放入元素,尾部取出元素。
class Test{
public static void main(String[] args){
Stack<String> s=new Stack<>();
s.push("b");
s.push("m");
s.push("a");
for(String str:s){
System.out.println(str);
}
/*
结果:
b
m
a
*/
}
}
队列
Queue是个接口,规定了先进先出队列的操作。
实现类有很多,LinkedList实现了List接口和Deque接口,而Deque接口(双端队列)继承了Queue接口,所以LinkedList可以用做列表和队列来使用。
这边主要用LinkedList来展示Queue定义的方法
入队
有两种方式:
add()添加成功会返回true,添加失败则抛出异常
offer()添加成功返回true,失败返回false
class Test{
public static void main(String[] args){
Queue<Integer> q=new LinkedList();
boolean add = q.add(2);
boolean offer = q.offer(3);
System.out.println(add); //true
System.out.println(offer); //true
}
}
查看队列头元素
也是两种方法:
element()如果队列为空,抛出异常
peek()如果队列为空返回null
但是注意:队列中可以放入多个null,如果使用peek()获取头部元素,如果此时头部为null则会产生误会。所以还需要根据队列中元素的个数来判断队列是否为空。
class Test{
public static void main(String[] args){
Queue<Integer> q=new LinkedList();
q.add(1);
q.add(2);
System.out.println(q.element());//1
System.out.println(q.peek());//1
}
}
出队
remove()方法 当队列不为空返回出队的元素,队列为空时抛出异常
poll()方法 当队列不为空时返回出队的元素,队列为空时返回null。这里同样有上面peek()的问题,就是当被弹出的元素为null时,会被误认为是队列为空,所以需要加上队列中元素的个数来判断。
class Test{
public static void main(String[] args){
Queue<Integer> q=new LinkedList();
q.add(1);
q.add(2);
q.add(6);
System.out.println(q.poll());//1
System.out.println(q.remove());//2
}
}
Queue接口没有定义判断队列个数的方法,但是Queue继承了Collection接口,该接口提供了size()方法来判断元素的个数还提供了isEmpty()方法来判断是否为空。
浅浅介绍到这里。
开发入门中,欢迎指教~