栈与队列链表版【Java算法(四)】
目录
项目结构:
array包下的类,属于上一章的内容。点击链接了解详情
1.栈
Stack.java
/*
链表版的栈
*/
public class Stack {
//节点
private class Node{
int data;//存放数据
Node next;//存放下一节点位置
//创建节点时,需要用到
Node(int data){
this.data = data;
}
}
private int top;//栈顶
private Node head;//头节点
private Node tail;//尾结点
/**
* 入栈
* @param data 放入的数据(也可以是元素)
*/
public void push(int data){
Node pushedData = new Node(data);//创建一个要入栈的节点
//如果此时是空栈
if(top == 0){
//将该元素作为头节点,尾结点
head = pushedData;
tail = pushedData;
}else{
//非空栈
tail.next = pushedData;
tail = pushedData;
}
top++;//入栈,栈顶加1
}
/**
* 出栈
* @return 返回一个出栈的元素
*/
public int pop() throws Exception{
Node node = head;
int data;//弹出的数据
//判断栈是否为空
if(top <= 0){
throw new Exception("栈为空,无法出栈!");
}
//当前只有1个元素在栈中
if(top == 1){
data = node.data;
top--;//出栈减一
return data;
}
//找到倒数第二个元素,将它设置成尾结点!
Node node1 = get(top - 2);
data = node1.next.data;//就是尾结点的数据
top--;//出栈,栈顶减一
return data;
}
/**
* 获取index位置的节点
* @param index 元素的位置
* @return 返回index位置的节点
*/
private Node get(int index){
Node node = head;
for(int i = 0;i < index;i++){
//当最后一次循环时,i = index - 1(index - 1时的节点的下一个节点,即我们要的节点)
node = node.next;
}
return node;
}
public String toString(){
Node node = head;//从头节点开始遍历
String str = "[";
for(int i = 0;i < top;i++){
str += node.data;
node = node.next;
if(i != top - 1){
str += ",";
}
}
str += "]";
return str;
}
}
2.队列
Queue.java
/*
队列:链表版
*/
public class Queue {
//节点
private class Node{
int data;//存放数据
Node next;//存放下一节点位置
//创建节点时,需要用到
Node(int data){
this.data = data;
}
}
private Node head;//头节点
private Node tail;//尾结点
private int font;//队头
private int rear;//队尾
/**
* 入队[队尾进行插入]
* @param element 入队的元素
*/
public void enQueue(int element){
Node insertedNode = new Node(element);//创建一个要插入队列的节点
//判断是否是空队列
if(font == rear){
//头节点、尾结点都是它 ==> 通过这一点,我们也可以知道这是只有1个节点
head = insertedNode;
}else{
//队列非空
tail.next = insertedNode;
}
tail = insertedNode;//这种方式也行,不管非空与否,都要将插入节点设置为尾结点
rear++;//插入元素后,队尾加1
}
/**
* 出队[元素从队头出去]
* @return 返回出队的数据
*/
public int outQueue() throws Exception{
if(font == rear){
//队列空,无法出队
throw new Exception("队列为空,无法出队!");
}
Node node = head;//在此处,头节点 == 队头
Node nextHeadNode = node.next;//头节点的下一个节点
int data;//返回出队的数据
data = node.data;//将队头的数据赋值给data
head = nextHeadNode;//将新的队头 ===> "原先队头"的下一个节点
font++;
return data;
}
/**
* 获取index位置的节点
* @param index 元素的位置
* @return 返回index位置的节点
*/
private Node get(int index){
Node node = head;
for(int i = 0;i < index;i++){
//当最后一次循环时,i = index - 1(index - 1时的节点的下一个节点,即我们要的节点)
node = node.next;
}
return node;
}
public String toString(){
Node node = head;//从头节点开始遍历
String str = "[";
for(int i = font;i < rear;i++){
str += node.data;
node = node.next;
if(i != rear - 1){
str += ",";
}
}
str += "]";
return str;
}
}
3.测试
TestLinkedlist.java
/*
测试链表
*/
public class TestLinkedlist {
public static void main(String[] args) {
Queue queue = new Queue();
System.out.println("入队:");
queue.enQueue(1);
queue.enQueue(2);
queue.enQueue(3);
queue.enQueue(4);
queue.enQueue(5);
queue.enQueue(6);
System.out.println(queue);
System.out.println("出队:");
try {
queue.outQueue();
queue.outQueue();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(queue);
}
}
最后,上述代码的视频在这里:点击链接,观看视频
完