循环队列(数据结构实训)(难度系数75)

本文介绍了如何使用模拟方法和Java的ArrayDeque数据结构实现给定空间限制的顺序循环队列,包括入队、出队操作,以及在满足特定条件时队列中元素的输出顺序。

题目:

标准输入输出
题目描述:
根据给定的空间构造顺序循环队列,规定队满处理方法为少用一个元素空间。例如,给定5个元素空间构造循环队列,则只能存放4个元素。试根据入队及出队操作判断队列最后的元素存放情况,并输出最后队列中的元素值,即完成给定入队及出列操作后一次性全部出队的元素值。要求采用顺序队列完成。
输入:
输入的第一行为一个自然数n,表示要求构造的顺序循环队列空间数。第二行为操作次k,接下来k行为出队入队操作,每行各代表一次操作。入队用in表示,出队用out表示,如果是入队,则in隔一空格后为一整数,表示入队元素值。

输出:
输出完成所有入队出队操作后,一次性出队元素。用一个空格隔开。可以假定队在完成所有操作后不为空。

输入样例:
4
7
in 1
in 2
in 5
in 6
out
out
in 8

输出样例:
5 8

代码:

方法一(模拟队列):

import java.util.*;

public class Xingyuxingxi {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt(),b=sc.nextInt(),n=0,m=0;;
        int []g=new int[a+1];//下标从1开始使用
        while(b--!=0) {
            String c=sc.next();
            if(c.equals("in")) {
                int d=sc.nextInt();
                if(n<a-1){//题目所储存的元素比空间少1
                    g[++n]=d;
                    if(m==a-1){//如果删除元素下标到达最大储存下标则从头开始删除
                        m=0;
                    }
                }
            }
            else {
                g[++m]=-1;//被删除的元素用-1表示
                if(n==a-1){//如果添加元素的下标到达最大储存下标则从头开始添加
                    n=0;
                }
            }
        }
        if(m==0)m++;
        //要求按入队顺序输出
        for (int i = m+1; i < a; i++) {//删除下标后面的元素即为先入队的
            System.out.print(g[i]+" ");
        }
        for (int i = 1; i <=m; i++) {//添加下标后面的元素即为后入队的
            if(g[i]!=-1) {
                System.out.print(g[i]+" ");
            }
        }
    }
}

方法二(队列):

import  java.util.*;

public class Xingyuxingxi {
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt();
        Queue<Integer>dui = new ArrayDeque<Integer>();
        int b= sc.nextInt();
        while(b--!=0)
        {
            String c=sc.next();
            if(c.equals("in"))
            {
                int d=sc.nextInt();
                if(dui.size()<a-1)
                {
                    dui.add(d);
                }
            }
            else
            {
                dui.poll();
            }
        }
        Object []x= dui.toArray();
        for (int i = 0; i < dui.size(); i++) {
            System.out.print(x[i]+" ");
        }
    }
}

/*
创建一个队列

这里使用实现类ArrayDeque
size()方法,返回队列长度
add()方法,将指定元素插入此队列的末尾。
poll()方法,删除队头元素,并获取该元素
toArray()方法,按顺序返回元素

以下为java1.6版本的Queue实现类
AbstractQueue,ArrayBlockingQueue,ArrayDeque,ConcurrentLinkedQueue,DelayQueue,LinkedBlockingDeque,LinkedBlockingQueue,LinkedList,PriorityBlockingQueue,PriorityQueue,SynchronousQueue

以下为java1.8版本的Queue实现类
AbstractQueue,ArrayBlockingQueue,ArrayDeque,ConcurrentLinkedDeque,ConcurrentLinkedQueue,DelayQueue,LinkedBlockingDeque,LinkedBlockingQueue,LinkedList,LinkedTransferQueue,PriorityBlockingQueue,PriorityQueue,SynchronousQueue
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星与星熙.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值