栈和队列是一种比较常见的数据结构,它们都是属于线性结构的一种数据类型,两者之间有很多相同和共通之处,下面通过图例和实际代码来演示这两种数据结构之间它们到底有什么相同和不同之处。
一、栈
栈由栈顶和栈底组成。具体什么是栈,我们可以把栈想象成一个手枪弹夹,弹夹里面的每颗子弹就是栈里面的每个元素,它遵循先进后出的原则,就好比手枪弹夹里面先压入的子弹要比后压入的子弹后击发,每压入一发子弹,前压入的子弹就要往下移动一个位置,留出的位置刚好留给后压入的子弹,一直到整个弹夹都压满为止,子弹与子弹之间是一种上下叠压的关系。
下面是栈存储元素和操作元素的执行示意图
代码演示:
1、封装一个util工具类,里面存放操作栈的各种方法。
package demo2;
import java.util.Arrays;
public class MyStack {
int[] elements; //目标数组
public MyStack() {
elements = new int[0]; //初始化数组长度
}
//查看元素的长度
public void size(){
System.out.println(Arrays.toString(elements));
}
//往栈里面压入元素
public void add(int element){
int[] newArray = new int[elements.length + 1]; //创建的新数组的长度要比目标数组的长度(容量)要大,要不然存放不下要新添的元素
for(int i = 0; i<elements.length; i++){ //把目标数组的所有元素拷贝进新数组中
newArray[i] = elements[i];
}
newArray[elements.length] = element; //把添加进来的新元素,追加到新数组的末尾位置
elements=newArray; //新数组替换到目标数组
}
//取出栈顶元素
public int pop(){
if(elements.length == 0){ //判断,栽中有没有元素
throw new RuntimeException("stack is empty");
}
int element = elements[elements.length - 1]; //取出目标数组的最后一个元素
int[] nweArray = new int[elements.length - 1]; //创建一个新数组,用于存放目标数组里面剩余的元素,长度与取出栈顶元素目标数组的长度一致
for(int i = 0; i < elements.length - 1; i++){ // i < elements.length - 1 : 因为已经取出了一个元素,所以要减去 1
nweArray[i] = elements[i];
}
elements = nweArray; //新数组替换目标数组
return element; //返回取出的栈顶元素
}
//原栈元素不动,仅查看栈顶元素,
public int peek(){
if(elements.length == 0){ //判断,栽中有没有元素
throw new RuntimeException("stack is empty");
}
return elements[elements.length - 1];
}
//判断栈是否为空
public boolean isEmpty(){
return elements.length == 0; //如果为0,则返回false,否则返回ture.
}
}
2、编写一个测试类,测试和调用工具类里面的方法
package demo2;
public class TestMyStack {
public static void main(String[] args) {
MyStack ms = new MyStack(); //创建一个栽
//往栽里面压入元素
ms.add(9);
ms.add(8);
ms.add(7);
//查看元素
ms.size();
//取出栽顶元素
// System.out.println(ms.pop());
// System.out.println(ms.pop());
// System.out.println(ms.pop());
//查看栈顶元素
System.out.println(ms.peek());
ms.pop();
System.out.println(ms.peek());
//判断栈顶是否为空
System.out.println(ms.isEmpty());
}
}
运行结果:
二、队列
队列由队头和队尾组成,遵循先进先出的原则。我们可以把队列想象成一群人排队过同一个安检口,排在队伍最前面的那个人,就是队头,反之,排在队伍最后面的哪个人就是队尾,等安检开检的时候,一定是排在队伍最前面的那个人,最先通过安检。
下面是队列存储元素和操作元素的执行示意图
代码演示:
1、封装一个util工具类,里面存放操作队列的各种方法。
package demo2;
/**
* 队列,先进先出
*/
public class MyQueue {
int[] elements; //目标数组
public MyQueue() {
elements = new int[0]; //初始化数组长度
}
//往队列添加数组(入队)
public void add(int element){
int[] newArray = new int[elements.length + 1]; //新写一个数组
for(int i = 0; i < elements.length; i++){
newArray[i] = elements[i];
}
newArray[elements.length] = element;
elements = newArray; //新数组替换目标数组
}
//出队
public int poll(){
int element = elements[0]; //取出队列中的第0个元素
int[] newArray = new int[elements.length - 1]; //新建数组
for(int i = 0; i < newArray.length; i++){
newArray[i] = elements[i + 1];
}
elements = newArray;
return element;
}
//判断队列是否为空
public boolean isEmpty(){
return elements.length == 0;
}
}
2、编写一个测试类,测试和调用工具类里面的方法
package demo2;
public class TestMyQueue {
public static void main(String[] args) {
//创建一个队列
MyQueue mq = new MyQueue();
//入队
mq.add(9);
mq.add(8);
mq.add(7);
//出队
System.out.println(mq.poll());
mq.add(6);
System.out.println(mq.poll());
System.out.println(mq.poll());
System.out.println(mq.isEmpty());
System.out.println(mq.poll());
// System.out.println(mq.isEmpty());
}
}
运行结果:
以上就是栈和队列的全部相关内容。