热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

玩转数据结构——栈和队列(队列)

interfaceQueue01classArray01publicclassArrayQueue01implementsQueue01

 

interface Queue01

1 interface Queue01{
2
3 int getSize();
4 boolean isEmpty();
5 void enqueue(E e);
6 E dequeue();
7 E getFront();
8 }

class Array01

1 class Array01 {
2
3 private E[] data;
4 private int size;
5
6 // 构造函数,传入数组的容量capacity构造Array01
7 public Array01(int capacity){
8 data = (E[])new Object[capacity];
9 size = 0;
10
11 }
12
13 // 无参数的构造函数,默认数组的容量capacity=20
14 public Array01(){
15 this(20);
16 }
17
18 // 获取数组的容量
19 public int getCapacity(){
20 return data.length;
21 }
22
23 // 获取数组中的元素个数
24 public int getSize(){
25 return size;
26 }
27
28 // 返回数组是否为空
29 public boolean isEmpty(){
30 return 0 == size;
31 }
32
33 // 在index索引的位置插入一个新元素e
34 public void add(int index, E e){
35 if(index <0 || index > size){
36 System.out.printf("index = %d\n",index);
37 throw new IllegalArgumentException("Add failed. Index is illegal.");
38 }
39
40 if(data.length == size){
41 resize(2 * data.length);
42 }
43
44 for(int i = size - 1; i >= index; i--){
45 data[i + 1] = data[i];
46 }
47
48 data[index] = e;
49 size++;
50
51 }
52
53 // 向所有元素后添加一个新元素
54 public void addLast(E e){
55 add(size,e);
56 }
57
58 // 在所有元素前添加一个新元素
59 public void addFirst(E e){
60 add(0,e);
61 }
62
63 // 获取index索引位置的元素
64 public E get(int index){
65 if(index <0 || index >= size){
66 throw new IllegalArgumentException("Get failed. Index is illegal.");
67 }
68
69 return data[index];
70 }
71
72 public E getLast(){
73 return get(size - 1);
74 }
75
76 public E getFirst(){
77 return get(0);
78 }
79
80 // 修改index索引位置的元素为e
81 public void set(int index, E e){
82 if(index <0 || index >= size){
83 throw new IllegalArgumentException("Set failed. Index is illegal.");
84 }
85
86 data[index] = e;
87 }
88
89 // 查找数组中是否有元素e
90 public boolean contains(E e){
91 /*for(int i = 0; i 92 if(data[i].equals(e)){
93 return true;
94 }
95 }*/
96 if(-1 != find(e)){
97 return true;
98 }
99
100 return false;
101 }
102
103 // 查找数组中元素e所在的索引,如果不存在元素e,则返回-1
104 public int find(E e){
105 for(int i = 0; i ){
106 if(data[i].equals(e)){
107 return i;
108 }
109 }
110
111 return -1;
112 }
113
114 // 从数组中删除index位置的元素, 返回删除的元素
115 public E remove(int index){
116 if(index <0 || index >= size){
117 throw new IllegalArgumentException("Remove failed. Index is illegal.");
118 }
119
120 E res = data[index];
121 for(int i = index + 1; i ){
122 data[i - 1] = data[i];
123 }
124
125 data[size - 1] = null;
126 size--;
127
128 if(data.length / 4 == size && data.length / 2 != 0){
129 resize(2 * data.length);
130 }
131 return res;
132 }
133
134 // 从数组中删除第一个元素, 返回删除的元素
135 public E removeFirst(){
136 return remove(0);
137 }
138
139 // 从数组中删除最后一个元素, 返回删除的元素
140 public E removeLast(){
141 return remove(size - 1);
142 }
143
144 // 从数组中删除元素e
145 public void removeElement(E e){
146 int index = find(e);
147
148 if(-1 != index){
149 remove(index);
150 }else{
151 throw new IllegalArgumentException("Remove failed. The element is not exsit.");
152 }
153 }
154
155 @Override
156 public String toString(){
157 StringBuilder res = new StringBuilder();
158 res.append(String.format("Array01: size = %d, capacity = %d\n",size,data.length));
159 res.append(‘[‘);
160 for(int i = 0; i ){
161 res.append(data[i]);
162 if(size - 1 != i){
163 res.append(", ");
164 }
165 }
166
167 res.append(‘]‘);
168
169 return res.toString();
170 }
171
172 // 将数组空间的容量变成newCapacity大小
173 private void resize(int newCapacity){
174 E[] newData = (E[])new Object[newCapacity];
175
176 for(int i = 0; i ){
177 newData[i] = data[i];
178 }
179
180 data = newData;
181
182 }
183
184 }

public class ArrayQueue01 implements Queue01

1 public class ArrayQueue01 implements Queue01{
2
3 private Array01 array;
4
5 public ArrayQueue01(int capacity){
6 array = new Array01<>(capacity);
7 }
8
9 public ArrayQueue01(){
10 array = new Array01<>();
11 }
12
13 @Override
14 public int getSize(){
15 return array.getSize();
16 }
17
18 @Override
19 public boolean isEmpty(){
20 return 0 == array.getSize();
21 }
22
23 public int getCapacity(){
24 return array.getCapacity();
25 }
26
27 @Override
28 public void enqueue(E e){
29 array.addLast(e);
30 }
31
32 @Override
33 public E dequeue(){
34 if(isEmpty()){
35 throw new IllegalArgumentException("Dequeue failed. The queue is empty.");
36 }
37
38 return array.removeFirst();
39 }
40
41 @Override
42 public E getFront(){
43 return array.getFirst();
44 }
45
46 @Override
47 public String toString(){
48 StringBuilder res = new StringBuilder();
49 res.append(String.format("ArrayQueue01: size = %d, capacity = %d\n",array.getSize(),array.getCapacity()));
50 res.append("Front [");
51 for(int i = 0; i ){
52 res.append(array.get(i));
53 if(array.getSize() - 1 != i){
54 res.append(", ");
55 }
56 }
57
58 res.append("] Tail");
59
60 return res.toString();
61
62 }
63
64 public static void main(String[] args) {
65
66 ArrayQueue01 queue = new ArrayQueue01<>();
67 for(int i = 0 ; i <8 ; i ++){
68 queue.enqueue(i);
69 System.out.println(queue);
70 if(i % 3 == 2){
71 queue.dequeue();
72 System.out.println(queue);
73 }
74 }
75 }
76 }

 

运行结果:

技术分享图片

 


推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
author-avatar
等待1314578
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有