2

我正在尝试将数据存储到堆栈中。如果我错了,请纠正我,堆栈是后进先出类型。所以,期待我的程序的输出会有点反转。但遗憾的是输出不同。我不确定代码的哪一部分是错误的。

请帮助:|

代码:

`

公共类 CorruptQueue {

public static void LineUp(){

    BufferedReader br = null;

try {

    String line;
    Stack nameStack = new Stack();
    Stack statusStack = new Stack();
    Stack stack = new Stack();

    br = new BufferedReader(new FileReader("C:/Users/user/Desktop/School Files/Project/CorruptOffice/input.txt"));

    while ((line = br.readLine()) != null) {


       StringTokenizer stringTokenizer = new StringTokenizer(line, " ");

       while (stringTokenizer.hasMoreElements()) {


        String lineup = stringTokenizer.nextElement().toString();
        String name = stringTokenizer.nextElement().toString();
        String status = stringTokenizer.nextElement().toString();



            nameStack.push(name);
            statusStack.push(status);
            System.out.println("Now serving "+ nameStack.pop() + " a " + statusStack.pop());



        /*StringBuilder sb = new StringBuilder();
        sb.append("" + lineup);
        sb.append(" " + name);
        sb.append("" + status);
        sb.append("\n\n");

        System.out.println(sb.toString());*/
       }

    }

    System.out.println("Done");

} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (br != null)
            br.close();

    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

    }



public static void main(String[] args) 
{
     LineUp();

} }`

输入:

阵容约翰常规

阵容鲍勃常规

阵容汤姆常规

阵容莎拉VIP

阵容玛丽VIP

阵容琼VIP

阵容 Bea VIP

阵容汉克常规

阵容艺术常规

阵容雏菊贵宾

阵容 Marius 常规

阵容 Dane VIP

输出:

现在为约翰服务

现在定期为鲍勃服务

现在为汤姆服务

现在为莎拉提供贵宾服务

现在为玛丽提供贵宾服务

现在为琼提供贵宾服务

现在为 Bea 提供 VIP

现在为汉克服务

现在定期为艺术服务

现在为 Daisy 服务 VIP

现在为马吕斯服务

现在为 Dane 服务 VIP

完毕

4

3 回答 3

8

你的堆栈操作似乎在这里

nameStack.push(name);
statusStack.push(status);
System.out.println("Now serving "+ nameStack.pop() + " a " + statusStack.pop());

现在,如果您在开始弹出任何内容之前将它们全部推送,那么您的堆栈将反转名称,但是您一次同时推送和弹出 1 个项目。

所以本质上,你推入name堆栈status,但在你做其他事情之前,你只需将它们弹出并将它们打印到控制台。

你的堆栈实际上并没有做任何事情。


如果你真的想反转你的输出,采取

System.out.println("Now serving "+ nameStack.pop() + " a " + statusStack.pop());

退出初始循环,然后将其放入新循环中。

于 2013-02-25T16:17:04.493 回答
5
  nameStack.push(name);
  statusStack.push(status);
  System.out.println("Now serving "+ nameStack.pop() + " a " + statusStack.pop());

好的。因此,您是说,将名称压入堆栈。然后立即从堆栈中弹出该名称。所以,是的,它是 LIFO,但你的堆栈中只有一个元素。尝试将 pop 操作完全移到 while 循环之外。然后有另一个 while 循环不断弹出元素,直到您的堆栈为空。

于 2013-02-25T16:16:56.877 回答
1

你的代码有这个部分:

 nameStack.push(name);
 statusStack.push(status);
 System.out.println("Now serving "+ nameStack.pop() + " a " + statusStack.pop());

当您将一个值压入堆栈时,您会再次将其弹出!您应该将它们全部打开,然后在它们全部打开后将它们弹出。

可能值得多一点堆栈,以确保您理解它们:)

于 2013-02-25T16:18:27.423 回答