Java队列和堆栈

Java队列和堆栈,java,stack,queue,Java,Stack,Queue,我有个小问题,希望有人能帮我解决。 这是一个赋值,所以我不应该使用从JavaAPI导入的类,也不应该以任何其他方式这样做(arraylist会让这更容易) 我创建了一个队列类和一个堆栈类。 我试图检索队列的头部,并将其添加到堆栈中。 我猜我需要创建一个方法,以某种方式获取列表头的值并存储它,以便使用它。 例如,如果我将“bob”、“jack”和“jill”按该顺序排入队列,它将如下所示: 鲍勃 杰克 吉尔 我想让bob从队列列表中出列,但将他添加到堆栈列表的头部,但我不知道如何进行。如果我的问题

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

鲍勃

杰克

吉尔

我想让bob从队列列表中出列,但将他添加到堆栈列表的头部,但我不知道如何进行。如果我的问题不是很精确,我很抱歉,我在表达我真正需要的东西时遇到了问题。如果需要任何其他信息,我会更新我的帖子。谢谢你的帮助

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

公共类队列{
LL队列;
公共队列(){
theQueue=newll();
}
公共布尔值为空(){
返回queue.isEmpty();
}
公共无效排队(T值){
insertTail(值);
}
public T dequeue()引发QueueException{
T retval=null;
试一试{
retval=theQueue.deleteHead();
}捕获(L例外e){
抛出新的QueueException(“队列为空”);
}
返回retval;}
公共字符串toString(){
返回queue.toString();
}}
和我的堆栈类:

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();
  }
公共类堆栈{
LL theStack;
公共堆栈()
{
theStack=newll();
}
公共布尔值为空()
{
返回stack.isEmpty();
}
公共无效推送(T值)
{
螺钉插入头(值);
}
public T pop()引发堆栈异常
{
T retval=null;
尝试
{
retval=theStack.deleteHead();
}
捕获(L例外e)
{
抛出新的堆栈异常(“堆栈下溢”);
}
返回返回;
}
公共布尔值isFull()
{
返回false;
}
公共字符串toStrin()
{
返回stack.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);
        }
    }
publicstaticvoidmain(字符串[]args){
Stack hired=新堆栈();
激发堆栈=新堆栈();
队列应用程序=新队列();
字符串温度;
对于(int i=0;i<1000;i++){
System.out.println(“输入要执行的操作的编号:”);
System.out.println(“1.接受申请”);
系统输出打印(“2.租用”);
系统输出打印(“3.火灾”);
System.out.println(“4.Exit”);
扫描仪kb=新扫描仪(System.in);
int key=kb.nextInt();
开关(钥匙){
案例1:
System.out.println(“输入申请人的姓名和ID,以分号分隔:”);
字符串applicator=kb.next()+“\n”;
System.out.println(“您输入”+申请人);
申请排队(申请人);
打破
案例2:
试一试{
temp=apps.dequeue();
}捕获(异常队列){
} 
请尝试{apps.dequeue();}
捕获(队列异常){
System.out.println(“队列为空”);}
租用。推送(临时);
案例3:
System.out.println();
案例4:System.out.println(“再见”);
系统出口(0);
}
}
因此,它不允许我将
apps.dequeue()
分配给
temp
,而不使用try-and-catch。但是当我执行
hired.push(temp);
时,我会收到一个错误,说temp可能尚未初始化。

使用迭代器(如果需要将值从队列的随机位置推送到堆栈中)。对于您的作业,简单的出列方法应该可以很好地工作,如另一个答案所述。 在调用dequeue方法之前,调用此迭代器并检查hasNext()是否为true。如果为true,则使用迭代器.next()获取值并存储它。
现在您的值位于“head”位置。现在调用dequeue方法并删除head值。现在只需将存储的值推入堆栈中即可。我认为您要做的是“将“bob”从队列中出列并添加到堆栈中”,不是吗? 所以我想你已经告诉我该怎么做了:

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

我将“出列”和“推送”都放在了try块中:如果“出列”失败,就不能推送任何东西。这对你合适吗?

你应该展示你到目前为止所做的事情。我有太多的类,我认为这会有很多代码要发布。但我会展示一些东西。你应该在队列中使用
堆栈作为参数。你不这样认为吗?:)@hugoSousa Wh你的意思是什么?它应该是类似于
public T dequee(Stack s)
,所以你知道应该添加哪个
Stack
元素。我不熟悉迭代器。我觉得这就是解决方案,但你能再详细说明一下吗?迭代器实际上是用来对元素进行迭代器的。迭代器就像(读作不一样),就像每个循环一样。它用于迭代(遍历)通过列表,尤其是当下一个元素通过“链接”与前一个元素相连时。与知道元素索引的数组不同,在列表中,您只知道下一个元素的链接,而不知道最后一个元素,依此类推。因此,您所能做的就是遍历它……一次遍历一个元素……使用迭代器。用于使用迭代器is(u还可以向其添加泛型):迭代器it=name of list.iterator();而(it.hasNext()){value=it.next();}第一行用于在您要遍历的“列表”上声明迭代器。第二行用于检查是否有任何“下一个元素”。第三行:如果有指向下一个元素的链接,请获取其值PS:我再次阅读了您的问题,实际上您的赋值不需要所有这些迭代器。您所需要的只是使用“出列”。当您退出队列时,队列头部位置的元素将被删除。现在,由于您具有头部中存在的值,只需获取该值即可
Queue<String> q = new Queue<String>(); 
Stack<String> s = new Stack<String>();
// ... enqueue three strings
String temp = q.dequeue();
s.push(temp);
String temp = ""; // explicitly initialize
try {
    temp = q.dequeue();
    s.push(temp);
} catch {
}