【Java】栈和队列的模拟实现(包括循环队列)

简介: 【Java】栈和队列的模拟实现(包括循环队列)

异常为空栈异常:

public class EmptyStackException extends RuntimeException {
    public  EmptyStackException(){
 
    }
    public  EmptyStackException(String msg){
        super(msg);
    }
 
}

循环队列

class MyCircularQueue {
    public  int[] elem;
    public  int front;//队头下标
    public  int rear;//队尾下标
    public MyCircularQueue(int k) {
        this.elem=new  int[k+1];
    }
 
    //入队
    public boolean enQueue(int value) {
        if(isFull()){
            return  false;
        }
        this.elem[rear]=value;
        rear=(rear+1) % elem.length;
        return  true;
    }
    //出队
    public boolean deQueue() {
        if (isEmpty()){
            return  false;
        }
 
        front=(front+1)%elem.length;
        return  true;
 
    }
    //获取队头元素
    public int Front() {
        if (isEmpty()){
            return  -1;
        }
        return  elem[front];
 
    }
    //获取队尾元素
    public int Rear() {
        if (isEmpty()){
            return  -1;
        }
        int index=(rear==0)?elem.length-1:rear-1;
        return  elem[index];
    }
    
    public boolean isEmpty() {
        return  rear==front;
    }
    public boolean isFull() {
        return (rear+1) % elem.length==front;
    }
}

普通队列:

import java.util.Queue;
 
//链式队列
public class MyQueue {
    static class Node{
        public  int val;
        public  Node next;
        public  Node(int val){
            this.val=val;
        }
        public  Node head;//队列的头
        public  Node tail;//队列的尾
 
        /*
        入队操作
         */
        public void offer(int val){
            Node node=new Node(val);
            if(head==null){
                head=node;
                tail=node;
            }else {
                tail.next=node;
                tail=tail.next;
            }
        }
        /*
        出队操作
         */
        public  int  poll(){
            if(head==null){
                return  -1;
            }
            int oldVal=head.val;
            if (head.next==null){
                head=tail=null;
            }else {
                head=head.next;
            }
            return  oldVal;
        }
        /*
        查看当前队头元素
         */
        public  int peek(){
            if(head==null){
                return  -1;
            }
            return  head.val;
        }
    }
 
 
 
}

栈:

import com.sun.scenario.effect.impl.prism.PrReflectionPeer;
 
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Stack;
public class MyStack {
    public int[] elem;
    public  int usedSize;
    //当前栈当中存储的有效数据个数
    public  static  final  int size=10;
    public  MyStack(){
        elem=new int[size];
    }
    /*
    判断当前栈是否是满的
     */
    public  boolean isFull(){
        if(usedSize==elem.length){
            return  true;
        }
        return false;
    }
    /*
    判断栈是否为空
     */
    public boolean isEmpty(){
        return  usedSize==0;
    }
 
    /**
     * 压栈
     */
    public  void push(int val){
        //1.判断栈是否是满的
        if (isFull()){
            elem= Arrays.copyOf(elem,2*elem.length);
        }
        //存放到当前的下标,同时usedSize需要自增
        elem[usedSize]=val;
        usedSize++;
    }
    /*
    删除栈顶元素
     */
    public  int pop(){
        if(isEmpty()){
            throw new EmptyStackException("栈为空");
        }
        int oldVal=elem[usedSize-1];
        usedSize--;
        return  oldVal;
    }
    /*
    获取栈顶元素但是不删除
     */
    public int peek(){
        if (isEmpty()){
            throw new  EmptyStackException("栈为空了");
        }
        return  elem[usedSize-1];
    }
 
 
}


目录
相关文章
|
4月前
|
存储 算法 Java
惊!Java程序员必看:JVM调优揭秘,堆溢出、栈溢出如何巧妙化解?
【8月更文挑战第29天】在Java领域,JVM是代码运行的基础,但需适当调优以发挥最佳性能。本文探讨了JVM中常见的堆溢出和栈溢出问题及其解决方法。堆溢出发生在堆空间不足时,可通过增加堆空间、优化代码及释放对象解决;栈溢出则因递归调用过深或线程过多引起,调整栈大小、优化算法和使用线程池可有效应对。通过合理配置和调优JVM,可确保Java应用稳定高效运行。
148 4
|
18天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
45 5
|
1月前
|
存储 算法 Java
🧠Java零基础 - Java栈(Stack)详解
【10月更文挑战第17天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
34 2
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
35 2
|
3月前
|
Java API 容器
JAVA并发编程系列(10)Condition条件队列-并发协作者
本文通过一线大厂面试真题,模拟消费者-生产者的场景,通过简洁的代码演示,帮助读者快速理解并复用。文章还详细解释了Condition与Object.wait()、notify()的区别,并探讨了Condition的核心原理及其实现机制。
|
2月前
|
存储 算法 Java
【用Java学习数据结构系列】用堆实现优先级队列
【用Java学习数据结构系列】用堆实现优先级队列
36 0
|
4月前
|
Java 索引
java中的栈(利用数组实现栈)
这篇文章通过Java代码示例介绍了如何使用数组实现栈操作,包括栈的初始化、入栈、出栈、判断栈满和空以及遍历栈的方法。
java中的栈(利用数组实现栈)
|
4月前
|
Java
java中的队列
这篇文章通过Java代码示例介绍了使用数组实现队列操作,包括队列的初始化、入队、出队、判断队列满和空以及遍历队列的方法。
java中的队列
|
5月前
|
Java 运维
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
70 2
|
5月前
|
存储 Java 对象存储
Java虚拟机(JVM)中的栈(Stack)和堆(Heap)
在Java虚拟机(JVM)中,栈(Stack)和堆(Heap)是存储数据的两个关键区域。它们在内存管理中扮演着非常重要的角色,但各自的用途和特点有所不同。
61 0