队列知识

1.队列的接口表示

 1 package com.neusoft.Queue;
 2 /**
 3  * @author zhao-chj
 4  * 队列的接口
 5  */
 6 public interface IQueue {
 7     public void clear();
 8     public boolean isEmpty();
 9     public int length();
10     //查看队列的头而不移除
11     public Object peek();
12     //出队,移除队列的头元素
13     public Object poll();
14     //入队,把元素压入队列
15     public void push(Object o);
16     public void display();
17 }

点击展开代码

 1 package com.neusoft.Queue;
 2 /**
 3  * @author zhao-chj
 4  * 队列的接口
 5  */
 6 public interface IQueue {
 7     public void clear();
 8     public boolean isEmpty();
 9     public int length();
10     //查看队列的头而不移除
11     public Object peek();
12     //出队,移除队列的头元素
13     public Object poll();
14     //入队,把元素压入队列
15     public void push(Object o);
16     public void display();
17 }

点击+复制代码

2.Node节点

 1 package com.neusoft.Queue;
 2
 3 public class Node {
 4     public Object data;// 数据域
 5     public Node next;// 指针域
 6     public Node() { //构造空节点
 7         this(null,null);
 8     }
 9     public Node(Object data){//构造有一个参数的数据域
10         this(data,null);
11     }
12     public Node(Object data,Node node){//构造数据域和指针域
13         this.data=data;
14         this.next=node;
15     }
16 }

点击复制代码

 1 package com.neusoft.Queue;
 2
 3 public class Node {
 4     public Object data;// 数据域
 5     public Node next;// 指针域
 6     public Node() { //构造空节点
 7         this(null,null);
 8     }
 9     public Node(Object data){//构造有一个参数的数据域
10         this(data,null);
11     }
12     public Node(Object data,Node node){//构造数据域和指针域
13         this.data=data;
14         this.next=node;
15     }
16 }

点击+复制代码

3.链队列主类(连式结构表示队列)

 1 package com.neusoft.Queue;
 2 /**
 3  * @author zhao-chj
 4  *    链队列
 5  */
 6 public class LinkQueue implements IQueue{
 7     private Node front;//队头指针
 8     private Node rear;//队尾指针
 9     public LinkQueue() {
10         // TODO 初始化链队列
11         front=rear=null;
12     }
13     @Override
14     public void clear() {
15         // TODO 置空
16         front=rear=null;
17     }
18     @Override
19     public boolean isEmpty() {
20         // TODO 判空
21         return front==null;
22     }
23     @Override
24     public int length() {
25         // TODO 长度
26         Node p=front;
27         int length=0;
28         while(p!=null){//一直查询到队尾为止
29             p=p.next;
30             length++;
31         }
32         return length;
33     }
34
35     @Override
36     public Object peek() {
37         // TODO 查看对头元素
38         if (front!=null) {
39             return front.data;
40         }else{
41             return null;
42         }
43     }
44     @Override
45     public Object poll() {
46         // TODO 出队,并返回出队数据元素
47         if (front !=null) {
48             Node p=front;
49             front=front.next;
50             if (p==rear) {
51                 rear=null;
52             }
53             return p.data;
54         }else {
55             return null;
56         }
57     }
58     @Override
59     public void push(Object o) {
60         // TODO 入队
61         Node p=new Node(o);
62         if (front !=null) {
63             rear.next=p;
64             rear=p;
65         }else {
66             front=rear=p;
67         }
68     }
69     @Override
70     public void display() {
71         // TODO 显示
72         if (!isEmpty()) {
73             Node p= front;
74             while(p!=rear.next){//从队头到队尾
75                 System.out.print(p.data.toString()+" ");
76                 p=p.next;
77             }
78         }else {
79             System.out.println("次队列为空~");
80         }
81
82     }
83
84 }

点击复制代码

 1 package com.neusoft.Queue;
 2 /**
 3  * @author zhao-chj
 4  *    链队列
 5  */
 6 public class LinkQueue implements IQueue{
 7     private Node front;//队头指针
 8     private Node rear;//队尾指针
 9     public LinkQueue() {
10         // TODO 初始化链队列
11         front=rear=null;
12     }
13     @Override
14     public void clear() {
15         // TODO 置空
16         front=rear=null;
17     }
18     @Override
19     public boolean isEmpty() {
20         // TODO 判空
21         return front==null;
22     }
23     @Override
24     public int length() {
25         // TODO 长度
26         Node p=front;
27         int length=0;
28         while(p!=null){//一直查询到队尾为止
29             p=p.next;
30             length++;
31         }
32         return length;
33     }
34
35     @Override
36     public Object peek() {
37         // TODO 查看对头元素
38         if (front!=null) {
39             return front.data;
40         }else{
41             return null;
42         }
43     }
44     @Override
45     public Object poll() {
46         // TODO 出队,并返回出队数据元素
47         if (front !=null) {
48             Node p=front;
49             front=front.next;
50             if (p==rear) {
51                 rear=null;
52             }
53             return p.data;
54         }else {
55             return null;
56         }
57     }
58     @Override
59     public void push(Object o) {
60         // TODO 入队
61         Node p=new Node(o);
62         if (front !=null) {
63             rear.next=p;
64             rear=p;
65         }else {
66             front=rear=p;
67         }
68     }
69     @Override
70     public void display() {
71         // TODO 显示
72         if (!isEmpty()) {
73             Node p= front;
74             while(p!=rear.next){//从队头到队尾
75                 System.out.print(p.data.toString()+" ");
76                 p=p.next;
77             }
78         }else {
79             System.out.println("次队列为空~");
80         }
81
82     }
83
84 }

点击+复制代码

4.测试链队列

 1 package com.neusoft.Queue;
 2 /**
 3  * @author zhao-chj
 4  * 测试连队列
 5  */
 6 public class DebugLinkQueue {
 7     public static void main(String[] args) {
 8          LinkQueue Q = new LinkQueue();
 9          for (int i = 0; i < 10; i++) {
10             Q.push(i);
11         }
12          System.out.println("队列中的各元素为");
13          Q.display();
14          System.out.println("查看队列是否为空!");
15          if (!Q.isEmpty()) {
16             System.out.println("非空");
17         }
18          System.out.println("队列长度为~"+Q.length());
19          System.out.println("队头元素为~"+Q.peek());
20          System.out.println("测试出队~");
21          Q.poll();
22          System.out.println("队头元素出队后的值为");
23          Q.display();
24          System.out.println("清除队列中所有元素~");
25          Q.clear();
26          if (Q.isEmpty()) {
27             System.out.println("队列为空~");
28         }
29     }
30 }

点击复制代码

 1 package com.neusoft.Queue;
 2 /**
 3  * @author zhao-chj
 4  * 测试连队列
 5  */
 6 public class DebugLinkQueue {
 7     public static void main(String[] args) {
 8          LinkQueue Q = new LinkQueue();
 9          for (int i = 0; i < 10; i++) {
10             Q.push(i);
11         }
12          System.out.println("队列中的各元素为");
13          Q.display();
14          System.out.println("查看队列是否为空!");
15          if (!Q.isEmpty()) {
16             System.out.println("非空");
17         }
18          System.out.println("队列长度为~"+Q.length());
19          System.out.println("队头元素为~"+Q.peek());
20          System.out.println("测试出队~");
21          Q.poll();
22          System.out.println("队头元素出队后的值为");
23          Q.display();
24          System.out.println("清除队列中所有元素~");
25          Q.clear();
26          if (Q.isEmpty()) {
27             System.out.println("队列为空~");
28         }
29     }
30 }

点击+复制代码

测试代码:

5.使用循环单链表表示循环队列

5.1需要使用循环链表类

  1 package com.neusoft.Queue;
  2 import com.neusoft.List.IList;
  3 /**
  4  * @author zhao-chj
  5  * 循环单链表
  6  */
  7 public class CircleLinkList implements IList{
  8     public Node head;
  9     public CircleLinkList() {
 10         // TODO 初始化
 11         head=new Node();//初始化头结点
 12         head.next=head;
 13     }
 14     @Override
 15     public void clear() {
 16         // TODO 清空
 17         head.next=head;
 18     }
 19     @Override
 20     public boolean isEmpty() {
 21         // TODO 判空
 22         return head.next.equals(head);
 23     }
 24     @Override
 25     public int length() {
 26         // TODO 长度
 27         Node p =head.next;
 28         int length=0;
 29         while (!p.equals(head)) {
 30             p=p.next;
 31             length++;
 32         }
 33         return length;
 34     }
 35     @Override
 36     public Object get(int i) {
 37         // TODO 读取带头结点的循环链表中第i个数据元素
 38         Node p=head.next;
 39         int j=0;
 40         while (!p.equals(head)&&j<i) {
 41             p=p.next;
 42             j++;
 43         }
 44         if (j>i||p.equals(head)) {
 45             System.out.println("第"+i+"个元素不存在!");
 46         }
 47         return p.data;
 48     }
 49
 50     @Override
 51     public void insert(int i, Object x) {
 52         // TODO 带头结点的循环链表中第i个节点之前插入一个值为x的元素
 53         Node p = head;
 54         int j=-1;//第i个节点前驱位置
 55         while ((!p.equals(head)||j==-1)&&j<i-1) {
 56             p=p.next;
 57             j++;
 58         }
 59         if (j>i-1||(p.equals(head)&&j!=-1)) {
 60             System.out.println("插入位置不合法!");
 61         }
 62         Node s =new Node(x);
 63         s.next=p.next;
 64         p.next=s;
 65     }
 66
 67     @Override
 68     public void remove(int i) {
 69         // TODO 移除循环单链表中第i个元素的节点,注意i的范围
 70         Node p=head;//p指向要删除节点的前驱节点
 71         int j=-1;
 72         while ((!p.next.equals(head)||j==-1)&&j<i-1) {//找前驱元素
 73             p=p.next;
 74             j++;
 75         }
 76         if (j>i-1||(p.next.equals(head)&&j!=-1)) {
 77             System.out.println("删除位置不合法!");
 78         }
 79         p.next=p.next.next;
 80     }
 81
 82     @Override
 83     public int indexOf(Object x) {
 84         // TODO 查找值为x的元素,返回位置
 85         Node p =head.next;//p指向首节点
 86         int j=0;
 87         while ((!p.equals(head))&&(!p.data.equals(x))) {
 88             p=p.next;
 89             j++;
 90         }
 91         if (!p.equals(head)) {
 92             return j;
 93         }else {
 94             return -1;
 95         }
 96     }
 97     @Override
 98     public void display() {
 99         // TODO 输出元素
100         Node p =head.next;
101         while (!p.equals(head)) {
102             System.out.print(p.data+" ");
103             p=p.next;
104         }
105         System.out.println();
106     }
107
108     @Override
109     public int remove(Object i) {
110         // TODO Auto-generated method stub
111         return 0;
112     }
113
114 }

点击可复制

  1 package com.neusoft.Queue;
  2 import com.neusoft.List.IList;
  3 /**
  4  * @author zhao-chj
  5  * 循环单链表
  6  */
  7 public class CircleLinkList implements IList{
  8     public Node head;
  9     public CircleLinkList() {
 10         // TODO 初始化
 11         head=new Node();//初始化头结点
 12         head.next=head;
 13     }
 14     @Override
 15     public void clear() {
 16         // TODO 清空
 17         head.next=head;
 18     }
 19     @Override
 20     public boolean isEmpty() {
 21         // TODO 判空
 22         return head.next.equals(head);
 23     }
 24     @Override
 25     public int length() {
 26         // TODO 长度
 27         Node p =head.next;
 28         int length=0;
 29         while (!p.equals(head)) {
 30             p=p.next;
 31             length++;
 32         }
 33         return length;
 34     }
 35     @Override
 36     public Object get(int i) {
 37         // TODO 读取带头结点的循环链表中第i个数据元素
 38         Node p=head.next;
 39         int j=0;
 40         while (!p.equals(head)&&j<i) {
 41             p=p.next;
 42             j++;
 43         }
 44         if (j>i||p.equals(head)) {
 45             System.out.println("第"+i+"个元素不存在!");
 46         }
 47         return p.data;
 48     }
 49
 50     @Override
 51     public void insert(int i, Object x) {
 52         // TODO 带头结点的循环链表中第i个节点之前插入一个值为x的元素
 53         Node p = head;
 54         int j=-1;//第i个节点前驱位置
 55         while ((!p.equals(head)||j==-1)&&j<i-1) {
 56             p=p.next;
 57             j++;
 58         }
 59         if (j>i-1||(p.equals(head)&&j!=-1)) {
 60             System.out.println("插入位置不合法!");
 61         }
 62         Node s =new Node(x);
 63         s.next=p.next;
 64         p.next=s;
 65     }
 66
 67     @Override
 68     public void remove(int i) {
 69         // TODO 移除循环单链表中第i个元素的节点,注意i的范围
 70         Node p=head;//p指向要删除节点的前驱节点
 71         int j=-1;
 72         while ((!p.next.equals(head)||j==-1)&&j<i-1) {//找前驱元素
 73             p=p.next;
 74             j++;
 75         }
 76         if (j>i-1||(p.next.equals(head)&&j!=-1)) {
 77             System.out.println("删除位置不合法!");
 78         }
 79         p.next=p.next.next;
 80     }
 81
 82     @Override
 83     public int indexOf(Object x) {
 84         // TODO 查找值为x的元素,返回位置
 85         Node p =head.next;//p指向首节点
 86         int j=0;
 87         while ((!p.equals(head))&&(!p.data.equals(x))) {
 88             p=p.next;
 89             j++;
 90         }
 91         if (!p.equals(head)) {
 92             return j;
 93         }else {
 94             return -1;
 95         }
 96     }
 97     @Override
 98     public void display() {
 99         // TODO 输出元素
100         Node p =head.next;
101         while (!p.equals(head)) {
102             System.out.print(p.data+" ");
103             p=p.next;
104         }
105         System.out.println();
106     }
107
108     @Override
109     public int remove(Object i) {
110         // TODO Auto-generated method stub
111         return 0;
112     }
113
114 }

点击+可复制代码

5.2循环链队列

 1 package com.neusoft.Queue;
 2 /**
 3  * @author zhao-chj
 4  *    循环链队列(采用带头结点的循链表表示)
 5  */
 6 public class CircleLinkQueue implements IQueue{
 7     private Node rear;//队尾指针,指向队尾元素
 8     private CircleLinkList cList;
 9     public CircleLinkQueue() {
10         // TODO 初始化链队列
11         cList=new CircleLinkList();
12         rear=cList.head;
13     }
14     @Override
15     public void clear() {
16         // TODO 置空
17         rear=cList.head;
18     }
19     @Override
20     public boolean isEmpty() {
21         // TODO 判空
22         return rear==cList.head;
23     }
24     @Override
25     public int length() {
26         // TODO 长度
27         return cList.length();
28     }
29
30     @Override
31     public Object peek() {
32         // TODO 查看对头元素
33         if (!isEmpty()) {
34             return cList.get(0);
35         }
36         return null;
37     }
38     @Override
39     public Object poll() {
40         // TODO 出队,并返回出队数据元素
41         if (!isEmpty()) {
42             Object t=cList.get(0);
43             cList.remove(0);
44             return t;
45         }
46         return null;
47
48     }
49     @Override
50     public void push(Object o) {
51         // TODO 入队
52         cList.insert(length(), o);
53         rear=new Node(cList.get(length()-1));
54     }
55     @Override
56     public void display() {
57         // TODO 显示
58         if (!isEmpty()) {
59             cList.display();
60         }else {
61             System.out.println("此队列为空~");
62         }
63     }
64
65 }

点击可复制代码

 1 package com.neusoft.Queue;
 2 /**
 3  * @author zhao-chj
 4  *    循环链队列(采用带头结点的循链表表示)
 5  */
 6 public class CircleLinkQueue implements IQueue{
 7     private Node rear;//队尾指针,指向队尾元素
 8     private CircleLinkList cList;
 9     public CircleLinkQueue() {
10         // TODO 初始化链队列
11         cList=new CircleLinkList();
12         rear=cList.head;
13     }
14     @Override
15     public void clear() {
16         // TODO 置空
17         rear=cList.head;
18     }
19     @Override
20     public boolean isEmpty() {
21         // TODO 判空
22         return rear==cList.head;
23     }
24     @Override
25     public int length() {
26         // TODO 长度
27         return cList.length();
28     }
29
30     @Override
31     public Object peek() {
32         // TODO 查看对头元素
33         if (!isEmpty()) {
34             return cList.get(0);
35         }
36         return null;
37     }
38     @Override
39     public Object poll() {
40         // TODO 出队,并返回出队数据元素
41         if (!isEmpty()) {
42             Object t=cList.get(0);
43             cList.remove(0);
44             return t;
45         }
46         return null;
47
48     }
49     @Override
50     public void push(Object o) {
51         // TODO 入队
52         cList.insert(length(), o);
53         rear=new Node(cList.get(length()-1));
54     }
55     @Override
56     public void display() {
57         // TODO 显示
58         if (!isEmpty()) {
59             cList.display();
60         }else {
61             System.out.println("此队列为空~");
62         }
63     }
64
65 }

点击+复制代码

5.3 循环链队列的测试

 1 package com.neusoft.Queue;
 2 /**
 3  * @author zhao-chj
 4  * 测试循环链队列
 5  */
 6 public class DebugCircleLinkQueue {
 7     public static void main(String[] args) {
 8          CircleLinkQueue Q = new CircleLinkQueue();
 9          for (int i = 0; i < 10; i++) {
10             Q.push(i);
11         }
12          System.out.println("队列中的各元素为");
13          Q.display();
14          System.out.println("查看队列是否为空!");
15          if (!Q.isEmpty()) {
16             System.out.println("非空");
17         }
18          System.out.println("队列长度为~"+Q.length());
19          System.out.println("队头元素为~"+Q.peek());
20          System.out.println("测试出队~");
21          Q.poll();
22          System.out.println("队头元素出队后的值为");
23          Q.display();
24          System.out.println("清除队列中所有元素~");
25          Q.clear();
26          if (Q.isEmpty()) {
27             System.out.println("队列为空~");
28         }
29     }
30 }

点击可复制代码

 1 package com.neusoft.Queue;
 2 /**
 3  * @author zhao-chj
 4  * 测试循环链队列
 5  */
 6 public class DebugCircleLinkQueue {
 7     public static void main(String[] args) {
 8          CircleLinkQueue Q = new CircleLinkQueue();
 9          for (int i = 0; i < 10; i++) {
10             Q.push(i);
11         }
12          System.out.println("队列中的各元素为");
13          Q.display();
14          System.out.println("查看队列是否为空!");
15          if (!Q.isEmpty()) {
16             System.out.println("非空");
17         }
18          System.out.println("队列长度为~"+Q.length());
19          System.out.println("队头元素为~"+Q.peek());
20          System.out.println("测试出队~");
21          Q.poll();
22          System.out.println("队头元素出队后的值为");
23          Q.display();
24          System.out.println("清除队列中所有元素~");
25          Q.clear();
26          if (Q.isEmpty()) {
27             System.out.println("队列为空~");
28         }
29     }
30 }

点击+复制代码

5.4 测试

END! 缺少顺序表表示队列的情形

时间: 2025-01-05 14:29:03

队列知识的相关文章

iOS开发 多线程(一)GCD中dispatch队列知识

GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用.所以说,结合block实现的GCD,把函数闭包(Closure)的特性发挥得淋漓尽致. dispatch队列的生成可以有这几种方式: 1. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_

哈理工 oj——队列列列列!!!!!

队列列列列!!!!! Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 337(148 users) Total Accepted: 154(142 users) Rating: Special Judge: No Description xuxu完成了栈的实验要求后,他又很是开心,刚要出去liuda, biaobiao突然问道老师让做的队列的那个实验你写完了么,xuxu顿时大呼悲哉....他给忘记了,怎么办..明天就要上交实验报告了

使用java实现阿里云消息队列简单封装

一.前言 最近公司有使用阿里云消息队列的需求,为了更加方便使用,本人用了几天时间将消息队列封装成api调用方式以方便内部系统的调用,现在已经完成,特此记录其中过程和使用到的相关技术,与君共勉. 现在阿里云提供了两种消息服务:mns服务和ons服务,其中我认为mns是简化版的ons,而且mns的消息消费需要自定义轮询策略的,相比之下,ons的发布与订阅模式功能更加强大(比如相对于mns,ons提供了消息追踪.日志.监控等功能),其api使用起来更加方便,而且听闻阿里内部以后不再对mns进行新的开发

多线程实现方案之GCD

<!doctype html> 多线程实现方案之GCD GCD是底层是一种C语言,主要是替代NSthread等线程技术 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 执行的步骤 将(任务)添加到队列中,GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循队列的FIFO原则:先进先出,后进后出 执行任务 GCD中有2个用来执行任务的常用函数 - 同步

一步一步写算法(之二叉树广度遍历)

原文:一步一步写算法(之二叉树广度遍历) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在二叉树的遍历当中,有一种遍历方法是不常见的,那就是广度遍历.和其他三种遍历方法不同,二叉树的广度遍历需要额外的数据结构来帮助一下?什么数据结构呢?那就是队列.因为队列具有先进先出的特点,这个特点要求我们在遍历新的一层数据之前,必须对上一次的数据全部遍历结束.暂时还没有掌握队列知识的朋友可以看一看我的这一篇博客-队列. a)下面是新添加的队列数据结构

疯狂的进制转换II

疯狂的进制转换II Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 309(196 users) Total Accepted: 219(193 users) Rating: Special Judge: No Description 进制转换是一个疯狂的问题,你需要将一个整数转化为32位的二进制形式. Input 本题有多组测试数据,对于每组数据输入一个正整数number,number不超过32位有符号整数的最大值,输入到文件结束

iOS多线程方案总结及使用详解

本篇文章整理了几种iOS中主要的多线程方案,提供了Swift和Objective-C两种语言的写法. 概述 iOS目前有四种多线程解决方案: NSThread GCD NSOperation Pthread Pthread这种方案太底层啦,实际开发中很少用到,下文主要介绍前三种方案 NSThread NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程,需要手动管理线程的生命周期,处理线程同步等问题. 创建方法 Obj

学了忘忘了看之Java多线程

Java多线程 什么是线程? 线程是相对于进程而言的,通常在计算机中,一个程序就是一个进程,而一个进程中可以有一个或多个的进程来完成该程序相关的功能. 举个不是很恰当的例子:例如乐队表演是一个进程,那么主唱和鼓手和和声等都可以理解为一个线程,他们共同来完成演奏一首曲子的工作. 什么是线程的并行和并发? 并行:指的是在同一台机器上,多个CPU同时执行同一段功能代码来完成功能: 并发:指的是在同一台机器上,CPU利用调度算法,以超高的速度切换进程来执行同一段代码来完成功能(让人感觉和并行一样): 理

老男孩Python高级全栈开发工程师【真正的全套完整无加密】

课程大纲 老男孩python全栈,Python 全栈,Python教程,Django教程,Python爬虫, scrapy教程,python高级全栈开发工程师,本套教程,4部分完整无缺,课程完结,官方售价6800元. 课程全部都是不加密,全部都有声音-不是网上那种几块钱十几块钱那种加密没有声音或者课程不全,贪便宜花冤枉钱不说都会严重影响学习,耽误大量时间! 本套全栈课程,不说完全媲美线下教学,只要你肯坚持,不会比面授差太多-坚持学完找一份python开发类的工作完全没问题,另外对于学习方面的投资