实现栈、队列、链表数据结构(java)
实现栈、队列、链表数据结构
1. 数组实现栈
[Java] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
public class MyStack { // 栈的底层使用数组来存储数据 int[] elements; public MyStack() { elements = new int[0]; } // 压入元素 public void push(int element) { //创建一个新的数组 int[] newArr = new int[elements.length + 1]; // 把数组中的元素复制到新数组中 for (int i = 0; i < elements.length; i++) { newArr = elements; } // 把添加的元素放入新的数组中 newArr[elements.length] = element; // 使用新数组替换旧数组 elements = newArr; } public int pop() { // 栈中没有元素 if (elements.length == 0) { throw new RuntimeException("stack is empty"); } // 取出数组的最后一个元素 int element = elements[elements.length - 1]; // 创建一个新的数组 int[] newArr = new int[elements.length - 1]; // 原数组中除了最后一个元素的其它元素放入新的数组中 for (int i = 0; i < elements.length - 1; i++) { newArr = elements; } // 替换数组 elements = newArr; // 返回栈顶元素 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; }//test public static void main(String[] args) { MyStack ms = new MyStack();// ms.push(9);// ms.push(8);// ms.push(7); System.out.println(ms.peek());// System.out.println(ms.pop()); System.out.println(ms.isEmpty());// System.out.println(ms.pop());// System.out.println(ms.pop()); }} |
2.数组实现队列
[Java] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
public class MyQueue { int[] elements; public MyQueue() { elements=new int[0]; } //入队 public void add(int element) { //创建一个新的数组 int[] newArr = new int[elements.length + 1]; // 把数组中的元素复制到新数组中 for (int i = 0; i < elements.length; i++) { newArr = elements; } // 把添加的元素放入新的数组中 newArr[elements.length] = element; // 使用新数组替换旧数组 elements = newArr; } //出队 public int poll() { //把数组中的第0个元素取出来 int element = elements[0]; //创建一个新的数组 int[] newArr = new int[elements.length-1]; //复制原数组中的元素到新的数组中 for(int i=0;i<newArr.length;i++) { newArr=elements[i+1]; } //替换数组 elements=newArr; return element; } //判断队列是否为空 public boolean isEmpty() { return elements.length==0; } //test 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()); } } |
3.单链表实现
[Java] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
public class Node { //节点内容 int data; //下一个节点 Node next; public Node(int data) { this.data=data; } //为节点追加节点 public Node append(Node node) { //当前节点 Node currentNode=this; //循环向后找 while(true) { //取出下一个节点 Node nextNode=currentNode.next; //如果下一个节点为null,当前节点已经是最后一个节点 if(nextNode==null) { break; } //赋给当前节点 currentNode=nextNode; } //把需要追回的节点追加为找到的当前节点的下一个节点 currentNode.next=node; return this; } //插入一个节点作为当前节点的下一个节点 public void after(Node node) { //取出下一个节点,作为下下一个节点 Node nextNext=next; //把新节点作为当前节点的下一个节点 this.next=node; //把下下一个节点设置为新节点的下一个节点 node.next=nextNext; } //显示所有节点信息 public void show() { Node currentNode = this; while(true) { System.out.print(currentNode.data+" "); //取出下一个节点 currentNode=currentNode.next; //如果是最后一个节点 if(currentNode==null) { break; } } System.out.println(); } //删除下一个节点 public void removeNext() { //取出下下一个节点 Node newNext = next.next; //把下下一个节点设置为当前节点的下一个节点 this.next=newNext; } //获取下一个节点 public Node next() { return this.next; } //获取节点中的数据 public int getData() { return this.data; } //当前节点是否是最后一个节点 public boolean isLast() { return next==null; } //test public static void main(String[] args) { Node n1=new Node(1); Node n2=new Node(2); Node n3=new Node(3); n1.append(n2).append(n3).append(new Node(4));// System.out.println(n1.next().next().next().getData());// System.out.println(n1.next().next().isLast()); n1.show(); n1.next().removeNext(); n1.show(); } } |
4.循环链表
<ignore_js_op>
5.双向循环链表
[Java] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
public class DoubleNode { // 上一个节点 DoubleNode pre = this; // 下一个节点 DoubleNode next = this; // 节点数据 int data; public DoubleNode(int data) { this.data = data; } // 新增节点 public void after(DoubleNode node) { // 原来的下一个节点 DoubleNode nextNext = next; // 把新节点作为当前节点的下一个节点 this.next = node; // 把当前节点作为新节点的前一个节点 node.pre = this; // 让原来的下一个节点作为新节点的下一个节点 node.next = nextNext; // 让新节点作为原来的下一个节点的前一个节点 nextNext.pre = node; } // 下一个节点 public DoubleNode next() { return this.next; } // 上一个节点 public DoubleNode pre() { return this.pre; } //获取数据 public int getData() { return this.data; } } |
文章摘自:https://blog.csdn.net/hnu_zzt/article/details/90742026

浙公网安备 33010602011771号