一般都是在学完线性表(顺序表和链表)之后,才会去学习栈和队列,因此可能会觉得栈和队列是一种新的数据结构,其实不然。它们逻辑上还是一对一的关系,所以说它们本质还是线性表,只不过是加了一定限制的线性表,具体加了哪些限制,且听我娓娓道来。
栈
这是一个线性表,我们可以对这个这个线性表内的任何一个元素进行需要的操作,我可以删掉既不是头也不是尾的[ 2 ]号元素,也可以在 [ 1 ]号位插入新的元素,就是说你对这个线性表里面的任何一个元素操作都是可以的,现在你把它放依次放到一个杯子里面。
可以看到最先进去的[ 0 ]号在杯子的最下面,最后进去的[ 3 ]号在杯子的最上面,当你想取[ 0 ]号的时候你先得依次取出[ 3 ], [ 2 ], [ 1 ],因为这个杯子就只有一个口,这个口在最上面。
而我们的栈就是对线性表人为的进行了类似杯子的这种限制,满足这个线性表只能在一端操作,即第一个进去的最后一个出来,最后一个进去的第一个出来——FILO(First In Last Out)或者 最后一个进去的第一个出来,第一个进去的最后一个出来——LIFO(Last In Fast Out),也就是只能对栈顶元素操作。
看起来是对原来线性表的尾插和尾删,在栈中有了新的名词分别叫做压栈(push)和出栈/弹出(pop)
在Java常用的有两种方式实现一个栈
第一种:
Stack<> stack = new Stack<>();
第二种:
Deque<> stack = new LinkedList<>();
都有常用的三个方法
push():压栈。
peek():查看栈顶元素(就是放入杯子中线性表的最后一个元素)。
pop():删除栈顶元素,并且返回被删除元素的值。
下面通过代码来看:
第一种:
import java.util.Stack;
public class Demo {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
stack.push("我");
stack.push("爱");
stack.push("中");
stack.push("国");
System.out.println(stack);
System.out.println(stack.empty());
System.out.println(stack.isEmpty());
System.out.println(stack.peek());
System.out.println(stack.pop());
System.out.println(stack);
}
}
运行结果:
第二种:
import java.util.Deque;
import java.util.LinkedList;
public class Demo {
public static void main(String[] args) {
Deque<String> stack = new LinkedList<>();
stack.push("我");
stack.push("爱");
stack.push("中");
stack.push("国");
System.out.println(stack);
System.out.println(stack.peek());
System.out.println(stack.pop());
System.out.println(stack);
System.out.println(stack.isEmpty());
}
}
运行结果:
需要注意的是第一种栈压栈时实际是线性表的尾插,第二种栈压栈时是线性表的头插,所以才会会看到在打印时,第一种是“我爱中国”,第二种是“国中爱我”。
队列
还是那个线性表,只不过这次不是装到杯子里而是将它塞入一根管子
所以这次对线性表的限制是新的元素只能从队尾插入,想操作的话也只能操作位于队首的元素。
在Java中通常这么实现一个队列
Queue<> queue = new LinkedList<>();
它的常用方法:
add():插入一个元素。
remove():删除队首元素,并且返回该元素的值。
element():查看队首元素。
下面通过代码来看:
import java.util.LinkedList;
import java.util.Queue;
public class Demo {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("a");
queue.add("b");
queue.add("c");
System.out.println(queue);
System.out.println(queue.peek());
System.out.println(queue.element());
System.out.println(queue.remove());
System.out.println(queue);
}
}
运行结果:
以上就是对栈和队列的简单介绍,如果理解有偏差还请各位看官在评论区指正,谢谢。