使用基于链表的队列

时间:2016-11-23 20:03:05

标签: java printing linked-list queue implementation

我有一个学校项目,要求我创建一个Printer类,代表将接收和处理打印作业的打印机。

其他所有内容似乎都运行良好,但我的process()方法似乎无法正常工作。它处理并删除请求的打印作业,但在size() == 0(每个托盘最初设置为容纳100页)时似乎不会停止处理打印作业。

如果没有纸张或size() == 0,则不应打印任何内容,并将该未处理的作业放回队列的末尾。请告诉我这里我做错了什么。非常感谢您的帮助。谢谢!

Printer.Java。 process()方法

        public Printer() {
            white = new PaperTray("White", "white", 100);
            yellow = new PaperTray("Yellow", "yellow", 100);
            printJobQ = new LinkedUnbndQueue<PrintJob>();
        }  
        //...
        /*
         * if the tray is empty then the job will not be processed
         * and will be added back to the end of the queue.
         */     
        public PrintJob process() {
            PrintJob currentJob = new PrintJob();
                try {
                   // make a reference to the dequeue job
                    currentJob = printJobQ.dequeue();

                   // remove the number of pages used for printing 
                   // from the appropriate tray                                                
                    if((currentJob.getColor().equalsIgnoreCase("white")) && (white.size() != 0)) {
                        white.remove(currentJob.getNumberOfPage());
                    } else if((currentJob.getColor().equalsIgnoreCase("yellow")) && (yellow.size() != 0)) {
                        yellow.remove(currentJob.getNumberOfPage());

                    // add unprocessed print job back to the queue***
                    } else if((white.size() == 0) || (yellow.size() == 0)) { 
                        printJobQ.enqueue(currentJob);
                    }

                } catch (QueueUnderFlowException e) {
                 //...
                } catch (PaperUnderFlowException e) {
                 //...
                }
            // return the info of the processed print job
            return currentJob;
        }

PaperTray.java

    // private int numberOfPage;    
    //...  
    public int size() {
        if(numberOfPage <= 0) {
            return 0;
        } else if(numberOfPage >= 100) {
            return 100;
        } else {
            return numberOfPage;
        }
    }
    //remove paper when print
    public void remove(int paper) throws PaperUnderFlowException {
        numberOfPage = numberOfPage - paper;
        if(numberOfPage < 0) {
            throw new PaperUnderFlowException("Paper under flow. Tray is empty");
        }
    }

LinkedUnbndQueue.java

    // private LLNode front, rear;
    //...
    public T dequeue() throws QueueUnderFlowException {
        if(isEmpty()) {
            throw new QueueUnderFlowException("Dequeue attempted on an empty queue");
        }
        else {
            T elementToRemove = front.getInfo();
            front = front.getLink();
            if(front == null)
                rear = null;

            return elementToRemove;
        }

    }

2 个答案:

答案 0 :(得分:0)

只是几个快速管家的事情。确保您不仅仅是在本网站上发布您的作业问题。我们不是来做你的工作。

其次要确保您不只是发布所有代码。仅发布相关内容并在以后根据需要添加信息。我们无法读取您的所有代码并为您调试。

最后回答你的问题。

T elementToRemove = front.getInfo();
        front = front.getLink();
        if(front == null)
            rear = null;

        return elementToRemove;
    }

}

这部分似乎并没有实际出列任何东西。你永远不会把元素拿走。你只需返回一个前面的元素。

免责声明:这只是在粗略查看您的代码之后,所以请花点时间确保您的链接列表实际上正在被正确操作。

答案 1 :(得分:0)

我想我明白了。而不是

 else if((white.size() == 0) || (yellow.size() == 0)) { 
                        printJobQ.enqueue(currentJob);
                    }

应该是

   if((currentJob.getColor().equalsIgnoreCase("white")) && (white.size() != 0)) {
        if((white.size() - currentJob.getNumberOfPage()) <= 0)
                printJobQ.enqueue(currentJob);
        white.remove(currentJob.getNumberOfPage());