在学会了单向链表之后,我们可以用链表来自己写一个队列,要这样写队列,那就得有一个
链表结点类:
public class LinkNode {
//定义结点跟数据属性
private Object obj;
private LinkNode node;
//重写构造器
public LinkNode(Object obj){
this.obj = obj;
}
//定义得到数据的方法
public Object getObj() {
return obj;
}
//定义写入数据的方法
public void setObj(Object obj) {
this.obj = obj;
}
//定义得到下一个结点的方法
public LinkNode getNode() {
return node;
}
//定义连接下一个结点的方法
public void setNode(LinkNode node) {
this.node = node;
}
}
然后就能写出一个自定义队列了,一个队列它需要有
增加、队列大小、删除、插入、修改、得到数据等方法。
public class MyList {
private LinkNode root=null;
private LinkNode end = root;
//在队列中增加元素
public void add(Object obj){
if(root==null){//如果根结点为null
root = new LinkNode(obj);
end = root;
}else {//如果根结点不为null
LinkNode node = new LinkNode(obj);
end.setNode(node);
end = node;
}
}
//得到队列的大小
public int size(){
int count = 0;
if(root==null){
return count;
}else{
count++;
LinkNode node = root.getNode();
while(node!=null){
count++;
node = node.getNode();
}
return count;
}
}
//得到指定位置上的数据
public Object get(int index){
int count = 0;
if(index>=size()||index<0){
throw new RuntimeException("超出范围!!!index:"+index);
}else{
if(index==0){
return root.getObj();
}else{
LinkNode node = root.getNode();
while(node!=null){
count++;
if(count==index){
return node.getObj();
}
node = node.getNode();
}
}
}
return 0;
}
//移除指定位置上的数据
public void remove(int index){
int count =0;
if(index>=size()||index<0){//如果下标超出范围
throw new RuntimeException("超出范围!!!index:"+index);
}else{//如果下标为0
if(index==0){
root = root.getNode();
}else{//如果下标在范围内切不为0
LinkNode node = root.getNode();
while(node!=null){
count++;
if(count==index-1){
LinkNode node1 = node.getNode();
LinkNode node2 = node1.getNode();
node.setNode(node2);
}
node = node.getNode();
}
}
}
}
//在指定位置修改队列里的数据
public void modify(int index ,Object obj){
int count =0;
if(index>=size()||index<0){//如果下标超出范围
throw new RuntimeException("超出范围!!!index:"+index);
}else{//如果下标为0
if(index==0){
root.setObj(obj);
}else{//如果下标在范围内且不为0
LinkNode node = root.getNode();
while(node!=null){
count++;
if(count==index){
node.setObj(obj);
}
node = node.getNode();
}
}
}
}
//在指定位置上插入元素
public void insert(int index,Object obj){
int count =0;
if(index>=size()||index<0){//如果下标超出范围
throw new RuntimeException("超出范围!!!index:"+index);
}else{//如果下标为0
if(index==0){
LinkNode node = new LinkNode(obj);
LinkNode tempnode =root;
root = node;
node = tempnode;
root.setNode(node);
}else{//如果下标在范围内且不为0
LinkNode node = root.getNode();
while(node!=null){
count++;
if(count==index-1){
LinkNode node1 = new LinkNode(obj);
LinkNode tempnode = node.getNode();
node.setNode(node1);
node1.setNode(tempnode);
}
node = node.getNode();
}
}
}
}
}
写好一个队列后我们可以来测试下
public class ListTest {
public static void main(String []args){
MyList list = new MyList();
for(int i=0;i<10;i++){
list.add("元素:"+i);
}
list.remove(3);
list.modify(7, "元素:"+10);
list.insert(0, "元素:"+11);
list.insert(6, "元素:"+12);
for(int i =0;i<list.size();i++){
Object o = list.get(i);
System.out.println(o);
}
System.out.println(list.size());
}
}
结果与我们所想一致,那么自定义的队列就写好了
分享到:
相关推荐
链表队列是一种使用链表结构来实现的队列数据结构。队列是一种先进先出(First In First Out, FIFO)的数据结构,即最先加入队列中的元素会最先被移除。在链表队列中,新加入的元素总是被添加到链表的尾部,而删除...
自定义Queue队列意味着我们需要创建一个类来实现Queue接口,以满足特定的需求或性能优化。 首先,让我们了解一下`java.util.Queue`接口提供的主要方法: 1. `void add(E e)`: 向队列尾部添加元素,如果队列已满,...
本主题将深入探讨线性表、链表、队列、栈这四种基本的数据结构,并以C++语言为例,通过相关源代码(stringData.cpp、seqList.cpp、node.cpp、seqQueue.cpp、linkQueue.cpp、linkStack.cpp、seqStack.cpp)来解析其...
Java 双端队列的实现 Java 中的双端队列(Deque)是一种特殊的队列,能够在队列的两端进行元素的添加和删除...Java 实现自定义双端队列可以通过链表和数组两种方式实现,双端队列可以充当单端队列,也可以用于充当栈。
标题 "索引队列-C#中的自定义队列" 指向了一个特定的数据结构实现,即在C#编程环境中创建一个支持索引访问的队列。在标准的`System.Collections.Generic.Queue<T>`类中,元素只能通过入队(Enqueue)和出队...
链队列是用链表实现的队列,其优点在于动态扩展容量的能力。在C++中,可以使用指针来创建队列的头部和尾部,插入(入队)操作在尾部进行,删除(出队)操作在头部进行。链队列的插入和删除操作通常比基于数组的队列...
例如,栈可以用数组或链表来实现,队列通常用数组(循环数组)或双端队列(deque)来实现。 在实际应用中,这些数据结构的C++实现可能采用了模板类,允许用户选择任何类型的元素进行存储,增强了代码的通用性和灵活...
C++中没有内置链表类型,但可以使用`std::list`或自定义结构来实现。 再者,我们讨论**栈**,它是一种后进先出(LIFO)的数据结构。栈的操作主要有压栈(push)和弹栈(pop),类似于现实生活中的堆叠物品,最后放...
通过这次专题实习,巩固和加深对所学相关知识点的理解,进一步熟悉基本自定义类、函数的应用加强对模块化程序设计和面向对象程序设计的理解。掌握C++语言程序设计的基本思想,了解简单的系统分析和设计方法。 在main...
C++中,可以使用标准模板库(STL)的`stack`容器来实现栈的操作,但在这个项目中,程序员选择自定义了栈的实现。栈的主要操作包括压栈(push)、弹栈(pop)、查看栈顶元素(top)以及检查栈是否为空(empty)。 接...
在Java中,可以使用`LinkedList`类来实现链表操作。 2. **队列**:队列是一种先进先出(FIFO)的数据结构。Java提供了`Queue`接口,`LinkedList`和`ArrayDeque`都可以实现队列功能。 3. **栈**:栈是一种后进先出...
队列是一种先进先出的数据结构,队列的实现可以使用链表模板类来实现。队列的主要操作有入队、出队、打印队首元素和获取队列元素数量等。 知识点三:模板类的声明和定义 在C++中,模板类的声明和定义不能分开,...
在编程领域,Delphi是一种基于Object Pascal语言的集成开发环境(IDE),它以其高效性和强大的Windows应用程序开发能力而闻名。...在实践中,自定义链表可用于各种用途,例如缓存、队列、栈或者复杂的数据结构实现。
自定义队列的实现方式有: 1. 双端队列(Deque):可以同时在两端进行入队和出队操作,例如C++中的`std::deque`。 2. 链表:使用链表,入队在尾部插入节点,出队则删除头部节点。 3. 循环数组:当数组满时,通过循环...
该代码主要是用C++语言来实现通过链表派生栈和队列
在C++中,循环队列可以使用数组或者链表来实现,这两种方式各有优缺点。下面我们将详细探讨这两种实现方式及其基本功能。 首先,我们来看数组实现的循环队列。数组是最基础的数据结构,它的优点是访问速度快,空间...
本资源提供了Java实现的数据结构代码,包括栈、动态数组、队列、链表和二叉树,这些都是计算机科学中最基础且重要的数据结构。 1. **栈(Stack)**:栈是一种“后进先出”(LIFO)的数据结构,常用于表达式求值、...
Python实现链表时,可以使用内置的类来简化操作,如`collections`模块中的`deque`可以用来模拟双向链表,但通常我们会选择自定义数据结构,以便更好地理解和控制链表的行为。 总的来说,链表在内存效率和动态性方面...
`custom_queue`项目旨在提供一个通用的对象自定义队列实现,它允许开发者根据具体需求定制队列的行为,例如添加特殊操作、同步机制或优化性能。该项目依赖于GSON、Google的异步库以及Jackson Core,这些库分别用于...
在Python中实现队列可以通过使用列表的append和pop方法来完成,也可以通过collections.deque来实现一个高效双端队列。 栈是一种后进先出(LIFO)的数据结构,它允许在列表的一端添加和删除元素,后添加进去的元素会...