在Java中堆栈不能正常工作?

时间:2013-02-25 16:13:35

标签: java stack

我正在尝试将数据存储到堆栈中。如果我错了,请更正我,stack是一个Last in,first out类型。所以,期待我的程序输出有点逆转。但很可惜的输出是不同的。我不确定代码的哪一部分是错的。

请帮忙:|

CODE:

`

公共类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();

} }`

INPUT:

阵容John常规

阵容鲍勃常规

阵容汤姆常规

阵容Sarah VIP

阵容Marie VIP

阵容Joan VIP

阵容Bea VIP

阵容Hank常规

阵容艺术常规

阵容Daisy VIP

阵容马里乌斯定期

阵容Dane VIP

输出:

现在正常为约翰服务

现在正常为鲍勃服务

现在正常为汤姆服务

现在为Sarah提供VIP

现在为玛丽提供VIP

现在为Joan提供VIP

现在为Bea服务

现在正常为汉克服务

现在定期为艺术服务

现在为Daisy提供VIP服务

现在正常为马吕斯服务

现在为丹麦人提供VIP

完成

3 个答案:

答案 0 :(得分:8)

您的堆栈操作似乎在这里

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

现在,如果你在开始弹出任何东西之前将它们全部推出,那么你的筹码将会颠倒你的名字,但是你同时推送和弹出1个项目。

所以从本质上讲,你将namestatus推到了堆栈上,但在你做其他的反对之前,你只需将它们弹回并打印到控制台。

你的筹码并没有真正做任何事情。


如果您确实要反转输出,请执行

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

退出初始循环,然后将其置于新循环中。

答案 1 :(得分:5)

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

行。所以,你说,把名字推到堆栈上。然后立即从堆栈中弹出该名称。所以,是的,它是LIFO,但你的堆栈中只有一个元素。尝试将pop操作完全移到while循环之外。然后有另一个while循环,它会保持弹出元素,直到你的堆栈为空。

答案 2 :(得分:1)

您的代码包含此部分:

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

当你将一个值推到堆栈上时,你会再次直接弹出它!你应该把它们全部打开,然后在所有它们打开后弹出它们。

可能值得reading up堆栈更多,只是为了确保你理解它们:)