【数据结构】(java实现)循环队列、顺序队列完整代码+详细注释

说明:

   循环队列与顺序队列十分相似,对其中部分内容稍作修改即可。

代码如下:


public class myqueue {
    private static final int Maxsize = 100;

    //队列中的每一个元素在java里面用静态内部类表示
    //在c++里面用结构体表示
    static class SqQueue {
        int front, rear;
        int[] queue;
    }

    public static boolean initQueue(SqQueue a) { //初始化,传入将要初始化的队列

        a.queue = new int[Maxsize];
        if (a.queue == null) {
            return false;//初始化失败
        }
        a.front = 0;
        a.rear = 0;
        return true;
    }

    public  static  boolean enQueue(SqQueue a, int e) {//传入将要操作的队列,和即将入队的元素
        //if (a.rear + 1 == Maxsize) {}//正常判断顺序队列是否为满队列
            if((a.rear+1)%Maxsize == a.front) {//通过循环队列方法判断队列是否为满队列
                //因为正常顺序队列判方式有可能存在元素已经出队,而使前面空间空出来的假满状态
                //采用循环队列的方式:只有在队列没有出队并且队列为满的情况下(a.rear+1)%Maxsize=0,front=0,其他情况下不相等
                return false;//队列已满插入失败
            }
            a.queue[a.rear++] = e;//循环队列去掉++,因为需要对当前rear操作
            //循环队列加上a.rear=(a.rear+1)%Maxsize;
        System.out.println(a.rear);
        return true;
    }

    public static int deQueue(SqQueue a) {//传入即将删除的队列
        if (a.front == a.rear) {//判断顺序队列是否为空
            return -1;
        }
        int e = a.queue[a.front];//将即将出队的元素存入临时变量e中
       //与对rear的操作一样防止临界情况超过界限,循环队列加上:  a.front=(a.front+1)%Maxsize;
        a.queue[a.front++]=0;//循环队列去掉++
        return e;  //返回出队元素
    }
   public   static int countQueue(SqQueue a){//求出队列实际元素个数
       System.out.println(a.rear);
        return(a.rear - a.front +Maxsize)%Maxsize;//为什么加Maxsize:不加当rear指向出队后的空间时相减会产生负数的情况
   }
   public  static int  getHead(SqQueue a){//顺序队列取值
        if (a.front!=a.rear){
            return a.queue[a.front];
        }
        return  -1;
   }
    public static void main(String[] args) {
        myqueue a=new myqueue();
        SqQueue q=new SqQueue();
        int n=0,x;
        a.initQueue(q);//初始化队列(一定要初始化,否则后面存储出错)
        System.out.println("请输入元素个数n:");
        Scanner scanner=new Scanner(System.in);
        n=scanner.nextInt();
        System.out.println("请依次输入n个整型数,依次顺序入队:");

        while(n-->0){
            x=scanner.nextInt();
            a.enQueue(q,x);//入队
        }
        System.out.println();
        System.out.println("顺序队列内元素个数,即长度:"+a.countQueue(q));
        System.out.println("顺序队头元素:"+a.getHead(q));
        System.out.println("元素依次出队:");
        while(true){//如果栈不空,则依次出栈
            x=a.deQueue(q);
            if(x!=-1)
                System.out.print(x+"\t");
            else
                break;
        }
        System.out.println();
        System.out.println("顺序队列内元素个数,即长度:"+a.countQueue(q));


    }

}

初学数据结构,如有错误望指正。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值