首页 文章资讯内容详情

Java实现栈和队列

2026-06-01 2 花语

本文内容纲要:

栈:LIFO(后进先出)

队列:FIFO(先进先出)

栈的顺序存储结构实现:

/** *基于数组实现的顺序栈 *@param<E> */ publicclassStack<E>{ privateObject[]data=null; privateintmaxSize=0;//栈容量 privateinttop=-1;//栈顶指针 /** *构造函数:根据给定的size初始化栈 */ Stack(){ this(10);//默认栈大小为10 } Stack(intinitialSize){ if(initialSize>=0){ this.maxSize=initialSize; data=newObject[initialSize]; top=-1; }else{ thrownewRuntimeException("初始化大小不能小于0:"+initialSize); } } //判空 publicbooleanempty(){ returntop==-1?true:false; } //进栈,第一个元素top=0; publicbooleanpush(Ee){ if(top==maxSize-1){ thrownewRuntimeException("栈已满,无法将元素入栈!"); }else{ data[++top]=e; returntrue; } } //查看栈顶元素但不移除 publicEpeek(){ if(top==-1){ thrownewRuntimeException("栈为空!"); }else{ return(E)data[top]; } } //弹出栈顶元素 publicEpop(){ if(top==-1){ thrownewRuntimeException("栈为空!"); }else{ return(E)data[top--]; } } //返回对象在堆栈中的位置,以1为基数 publicintsearch(Ee){ inti=top; while(top!=-1){ if(peek()!=e){ top--; }else{ break; } } intresult=top+1; top=i; returnresult; } }

栈的链式存储结构实现:

publicclassLinkStack<E>{ //链栈的节点 privateclassNode<E>{ Ee; Node<E>next; publicNode(){} publicNode(Ee,Nodenext){ this.e=e; this.next=next; } } privateNode<E>top;//栈顶元素 privateintsize;//当前栈大小 publicLinkStack(){ top=null; } //当前栈大小 publicintlength(){ returnsize; } //判空 publicbooleanempty(){ returnsize==0; } //入栈:让top指向新创建的元素,新元素的next引用指向原来的栈顶元素 publicbooleanpush(Ee){ top=newNode(e,top); size++; returntrue; } //查看栈顶元素但不删除 publicNode<E>peek(){ if(empty()){ thrownewRuntimeException("空栈异常!"); }else{ returntop; } } //出栈 publicNode<E>pop(){ if(empty()){ thrownewRuntimeException("空栈异常!"); }else{ Node<E>value=top;//得到栈顶元素 top=top.next;//让top引用指向原栈顶元素的下一个元素 value.next=null;//释放原栈顶元素的next引用 size--; returnvalue; } } }

基于LinkedList实现的栈结构:

importjava.util.LinkedList; /** *基于LinkedList实现栈 *在LinkedList实力中只选择部分基于栈实现的接口 */ publicclassStackList<E>{ privateLinkedList<E>ll=newLinkedList<E>(); //入栈 publicvoidpush(Ee){ ll.addFirst(e); } //查看栈顶元素但不移除 publicEpeek(){ returnll.getFirst(); } //出栈 publicEpop(){ returnll.removeFirst(); } //判空 publicbooleanempty(){ returnll.isEmpty(); } //打印栈元素 publicStringtoString(){ returnll.toString(); } }

队列的顺序存储结构实现

publicclassQueue<E>{ privateObject[]data=null; privateintmaxSize;//队列容量 privateintfront;//队列头,允许删除 privateintrear;//队列尾,允许插入 //构造函数 publicQueue(){ this(10); } publicQueue(intinitialSize){ if(initialSize>=0){ this.maxSize=initialSize; data=newObject[initialSize]; front=rear=0; }else{ thrownewRuntimeException("初始化大小不能小于0:"+initialSize); } } //判空 publicbooleanempty(){ returnrear==front?true:false; } //插入 publicbooleanadd(Ee){ if(rear==maxSize){ thrownewRuntimeException("队列已满,无法插入新的元素!"); }else{ data[rear++]=e; returntrue; } } //返回队首元素,但不删除 publicEpeek(){ if(empty()){ thrownewRuntimeException("空队列异常!"); }else{ return(E)data[front]; } } //出队 publicEpoll(){ if(empty()){ thrownewRuntimeException("空队列异常!"); }else{ Evalue=(E)data[front];//保留队列的front端的元素的值 data[front++]=null;//释放队列的front端的元素 returnvalue; } } //队列长度 publicintlength(){ returnrear-front; } }

循环队列的顺序存储结构实现

importjava.util.Arrays; publicclassLoopQueue<E>{ publicObject[]data=null; privateintmaxSize;//队列容量 privateintrear;//队列尾,允许插入 privateintfront;//队列头,允许删除 privateintsize=0;//队列当前长度 publicLoopQueue(){ this(10); } publicLoopQueue(intinitialSize){ if(initialSize>=0){ this.maxSize=initialSize; data=newObject[initialSize]; front=rear=0; }else{ thrownewRuntimeException("初始化大小不能小于0:"+initialSize); } } //判空 publicbooleanempty(){ returnsize==0; } //插入 publicbooleanadd(Ee){ if(size==maxSize){ thrownewRuntimeException("队列已满,无法插入新的元素!"); }else{ data[rear]=e; rear=(rear+1)%maxSize; size++; returntrue; } } //返回队首元素,但不删除 publicEpeek(){ if(empty()){ thrownewRuntimeException("空队列异常!"); }else{ return(E)data[front]; } } //出队 publicEpoll(){ if(empty()){ thrownewRuntimeException("空队列异常!"); }else{ Evalue=(E)data[front];//保留队列的front端的元素的值 data[front]=null;//释放队列的front端的元素 front=(front+1)%maxSize;//队首指针加1 size--; returnvalue; } } //队列长度 publicintlength(){ returnsize; } //清空循环队列 publicvoidclear(){ Arrays.fill(data,null); size=0; front=0; rear=0; } }

队列的链式存储结构实现

publicclassLinkQueue<E>{ //链栈的节点 privateclassNode<E>{ Ee; Node<E>next; publicNode(){ } publicNode(Ee,Nodenext){ this.e=e; this.next=next; } } privateNodefront;//队列头,允许删除 privateNoderear;//队列尾,允许插入 privateintsize;//队列当前长度 publicLinkQueue(){ front=null; rear=null; } //判空 publicbooleanempty(){ returnsize==0; } //插入 publicbooleanadd(Ee){ if(empty()){//如果队列为空 front=newNode(e,null);//只有一个节点,front、rear都指向该节点 rear=front; }else{ Node<E>newNode=newNode<E>(e,null); rear.next=newNode;//让尾节点的next指向新增的节点 rear=newNode;//以新节点作为新的尾节点 } size++; returntrue; } //返回队首元素,但不删除 publicNode<E>peek(){ if(empty()){ thrownewRuntimeException("空队列异常!"); }else{ returnfront; } } //出队 publicNode<E>poll(){ if(empty()){ thrownewRuntimeException("空队列异常!"); }else{ Node<E>value=front;//得到队列头元素 front=front.next;//让front引用指向原队列头元素的下一个元素 value.next=null;//释放原队列头元素的next引用 size--; returnvalue; } } //队列长度 publicintlength(){ returnsize; } }

基于LinkedList实现队列结构

/** *使用java.util.Queue接口,其底层关联到一个LinkedList(双端队列)实例. */ importjava.util.LinkedList; importjava.util.Queue; publicclassQueueList<E>{ privateQueue<E>queue=newLinkedList<E>(); //将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回true, //如果当前没有可用的空间,则抛出IllegalStateException。 publicbooleanadd(Ee){ returnqueue.add(e); } //获取,但是不移除此队列的头。 publicEelement(){ returnqueue.element(); } //将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时, //此方法通常要优于add(E),后者可能无法插入元素,而只是抛出一个异常。 publicbooleanoffer(Ee){ returnqueue.offer(e); } //获取但不移除此队列的头;如果此队列为空,则返回null publicEpeek(){ returnqueue.peek(); } //获取并移除此队列的头,如果此队列为空,则返回null publicEpoll(){ returnqueue.poll(); } //获取并移除此队列的头 publicEremove(){ returnqueue.remove(); } //判空 publicbooleanempty(){ returnqueue.isEmpty(); } }

本文内容总结:

原文链接:https://www.cnblogs.com/CherishFX/p/4608880.html