Java队列和堆栈

时间:2015-02-02 00:20:16

标签: java stack queue

我有一个小问题,我希望有人可以帮助我。 这是一个赋值,所以我不应该使用从java API导入的类,也不应该以任何其他方式执行此操作(arraylist会使这更容易。) 我创建了一个Queue类和一个Stack类。 我试图检索队列的头部,并将其添加到堆栈。 我猜我需要创建一个方法,以某种方式获取列表头部的值并存储它,以便我可以使用它。 例如,如果我按顺序将“bob”,“jack”和“jill”排入队列,它将如下所示:

鲍勃

插孔

吉尔

我想从队列列表中取消bob,但是将他添加到Stack列表的头部,但我无法弄清楚如何。如果我的问题不是很精确,我很抱歉,我的问题就是我真正需要的问题。如果需要任何其他信息,我会更新我的帖子。谢谢你的帮助。

这是我的Queueclass: (LL是我的链接列表类)

public class Queue<T extends Comparable<T>> {

LL<T> theQueue;

public Queue() {
    theQueue = new LL<T>();
}

public boolean isEmpty() {
    return theQueue.isEmpty();
}

public void enqueue(T value) {
    theQueue.insertTail(value);
}

public T dequeue() throws QueueException {
T retval = null;
try {
retval=theQueue.deleteHead();

}catch (LLException e) {
throw new QueueException ("Queue is empty");
}
return retval;}

public String toString() {
    return theQueue.toString();

   }}

我的Stack Class:

public class Stack<T extends Comparable<T>>{
LL<T> theStack;

 public Stack()
 {
   theStack = new LL<T>();
}

 public boolean isEmpty()
  {
    return theStack.isEmpty();
   }

     public void push(T value)
  {
    theStack.insertHead(value);
  }

   public T pop() throws StackException
   {
     T retval = null;
     try
    {
      retval = theStack.deleteHead();
     }
     catch (LLException e)
    {
       throw new StackException("Stack Underflow");
     }
    return retval;
   }

   public boolean isFull()
   {
     return false;
   }

   public String toStrin()
  {
    return theStack.toString();
  }

主类:

      public static void main(String[] args) {

    Stack <String> hired = new Stack<String>();
    Stack <String> fired = new Stack<String>();
    Queue <String> apps = new Queue<String>();
    String temp;
    for (int i = 0; i < 1000; i++) {
        System.out.println("Enter the number of the action to perform:");
        System.out.println("1. Accept Application");
        System.out.println("2. Hire");
        System.out.println("3. Fire");
        System.out.println("4. Exit");

        Scanner kb = new Scanner(System.in);

        int key = kb.nextInt();

        switch (key) {

            case 1:
                System.out.println("Enter applicant's name and ID separated by semi-colon:");
                String applicant = kb.next() + "\n";
                System.out.println("You entered " + applicant);

                apps.enqueue(applicant);
                break;

            case 2: 
                try{
                 temp = apps.dequeue();
                } catch (QueueException s) {
                } 

                try{ apps.dequeue(); }
                catch (QueueException s){ 
                    System.out.println("Queue is empty");} 
                hired.push(temp);

            case 3:
                System.out.println();


            case 4: System.out.println("Bye");
        System.exit(0);
        }
    }

因此,如果没有try和catch,我就不会将apps.dequeue()分配给temp。但是当我做hired.push(temp);时,我得到一个错误,说temp可能尚未初始化。

2 个答案:

答案 0 :(得分:2)

我认为你想做的是&#34;出局&#34; bob&#34;从队列中将它添加到Stack&#34;,不是吗? 所以我想你已经告诉我该怎么做了:

Queue<String> q = new Queue<String>(); 
Stack<String> s = new Stack<String>();
// ... enqueue three strings
String temp = q.dequeue();
s.push(temp);

是 - 此任务与Queue和Stack类的实现无关。它只是关于使用界面。只要您正确实现了它们,这些代码就可以正常工作。

修改 也许这就是你想要的:

String temp = ""; // explicitly initialize
try {
    temp = q.dequeue();
    s.push(temp);
} catch {
}

我把两个dequeue和push都放在try块中:如果dequeue失败,则不会推送任何东西。这适合你吗?

答案 1 :(得分:0)

使用迭代器(如果需要将值从队列的随机位置推送到堆栈中)。对于你的任务,简单的dequeue方法应该正常工作,如另一个答案所指出的那样。 在调用dequeue方法之前,调用此迭代器并检查是否hasNext()。如果为true,则使用iterator.next()获取值并存储它。 现在你有'head'位置的值。现在调用dequeue方法并删除head值。现在只需将存储的值推入堆栈