我试图编写一个实际上是堆栈的程序。给定一个包含某些关键字的文本文件,我希望我的程序逐行评估文本,并对堆栈执行请求的操作。
例如,如果输入文件是:
push 10
push 20
push 30
生成的堆栈应如下所示:
30
20
10
但是,我不知道如何将这些值推入堆栈而不在单词push
之后对int值进行硬编码。我创建了一个String变量并将其分配给scanner.nextLine()
从那里,我将该行与strLine进行比较:如果strLine等于push
后跟一些Number,那么该数字将被推入堆栈。
但是,似乎方法nextInt()
不从输入流中获取此数字。
Scanner input = new Scanner(file)
int number;
String strLine;
while (input.hasNextLine()){
strLine = input.nextLine();
number = input.nextInt();
if(strLine.equals("push " + number)){
stack.push(number);
}
我该如何解决这个问题?
谢谢。
答案 0 :(得分:1)
获取输入并将其拆分为空格“”! 这会给[“推”,“1”] 将第一个索引转换为int,然后将值推送到堆栈!
while (input.hasNextLine()){
String[] strLine = input.nextLine().split(" ");
if(strLine[0].equals("push")){
stack.push(Integer.parseInt(strLine[1]));
}
else if(strLine[0].equals("pop")){
stack.pop();
}
else{
system.out.println("Please enter a valid input!");
}
}
希望它有所帮助!
答案 1 :(得分:1)
event.target
读取整行,包括数字。您可以做的是使用input.nextLine
来获取“推送”,使用input.next()
来获取数字。这个例子是使用Scanner和System.in(所以它需要“退出”来退出while循环),但是它也应该使用一个文件(在这种情况下你不需要输入“quit”来退出程序,因为它会在输入文件没有更多输入时自动执行此操作)。使用input.nextInt()
(正如其他一些答案所建议的那样)的优点是你可以使用try / catch块捕获整数输入中的任何错误。
parseInt
示例输出:
import java.util.Scanner;
import java.util.Stack;
import java.util.InputMismatchException;
public class StackScanner {
public static void main(String args[]) {
Stack<Integer> stack = new Stack<Integer>();
Scanner input = new Scanner(System.in);
int number;
String strLine;
while (input.hasNext()){
strLine = input.next();
if(strLine.equals("push")){
try {
number = input.nextInt();
stack.push(number);
} catch ( InputMismatchException e) {
System.out.println("Invalid input. Try again.");
input.nextLine();
continue;
}
} else {
break;
}
}
System.out.println(stack);
}
}
答案 2 :(得分:0)
改变这个:
number = input.nextInt();
到此:
number = Integer.parseInt(input.nextLine());
答案 3 :(得分:0)
如果我理解你的问题,我会简单地通过分割空格来对行进行标记。
看起来你的输入是相对有条理的:你有一个关键字,然后是空格,然后是数字。如果您的数据确实属于此结构,请将该行拆分为两个令牌。读取第二个值。例如:
String tokens[] = strLine.split(" ");
// tokens[0] is the keyword, tokens[1] is the value
if(tokens[0].equals("push")){
// TODO: check here that tokens[1] is an int
stack.push(Integer.parseInt(tokens[1]));
} else if (tokens[0].equals("pop")) { // maybe you also have pop
int p = stack.pop();
} else if ... // maybe you have other operations
答案 4 :(得分:0)
nextLine方法解析整行,包括行中的任何数字。因此,您需要注意拆分行并解析代码中的数字。
下面的内容将适用于我用空格分割线条的地方。虽然,有很多这样的方法可能。
Scanner input = new Scanner(file);
String strLine;
Stack<Integer> stack = new Stack<>();
int number;
while (input.hasNextLine()){
strLine = input.nextLine();
if(strLine.startsWith("push")){
String[] sArr = strLine.split("\\s+");
System.out.println(strLine);
if(sArr.length==2){
number=Integer.parseInt(sArr[1]);
stack.push(number);
System.out.println(number);
}
}
}