【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];
    }
 
 
}


目录
相关文章
|
5天前
|
Java 索引
java中的栈(利用数组实现栈)
这篇文章通过Java代码示例介绍了如何使用数组实现栈操作,包括栈的初始化、入栈、出栈、判断栈满和空以及遍历栈的方法。
java中的栈(利用数组实现栈)
|
5天前
|
Java
java中的队列
这篇文章通过Java代码示例介绍了使用数组实现队列操作,包括队列的初始化、入队、出队、判断队列满和空以及遍历队列的方法。
java中的队列
|
26天前
|
Java 运维
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
28 2
|
1月前
|
存储 安全 Java
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
47 3
|
1月前
|
存储 缓存 监控
Java面试题:解释堆和栈的OutOfMemoryError通常在什么情况下会发生
Java面试题:解释堆和栈的OutOfMemoryError通常在什么情况下会发生
30 3
|
1月前
|
设计模式 安全 Java
Java面试题:请解释Java中的线程池以及为什么要使用线程池?请解释Java中的内存模型以及如何避免内存泄漏?请解释Java中的并发工具包以及如何实现一个简单的线程安全队列?
Java面试题:请解释Java中的线程池以及为什么要使用线程池?请解释Java中的内存模型以及如何避免内存泄漏?请解释Java中的并发工具包以及如何实现一个简单的线程安全队列?
33 1
|
19天前
|
存储 Java 对象存储
Java虚拟机(JVM)中的栈(Stack)和堆(Heap)
在Java虚拟机(JVM)中,栈(Stack)和堆(Heap)是存储数据的两个关键区域。它们在内存管理中扮演着非常重要的角色,但各自的用途和特点有所不同。
30 0
|
28天前
|
存储 Java
JAVA程序运行问题之JVM 中的栈如何解决
JAVA程序运行问题之JVM 中的栈如何解决
|
1月前
|
存储 安全 Java
Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
总之,虽然在日常开发中,`java.util.Stack`正逐渐被其他类如 `Deque`接口的实现所取代,但手写一个栈(无论是基于数组还是链表)都是一次很好的编程练习,它可以帮助开发者更加深入地理解栈这种数据结构的工作原理和各种操作。
21 0
|
1月前
|
存储 设计模式 监控
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
28 0