这是我给出的任务:
编写一个程序,要求用户输入一个整数,然后逐个输出该整数的数字。例如,如果用户输入2017,则程序应输出"您的数字为2,0,1和7。"使用堆栈来执行此操作。
我已经实现了我的算法来完成这个任务,但是,每当我打印从extract_Digits_Stack
方法返回的结果时,输出都是空白的,即没有任何内容打印到控制台。有人知道为什么会这样吗?
import java.util.Scanner;
import java.util.Stack;
public class Extract_Digits
{
//main method
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
System.out.printf("Enter an integer : ");
String inputString = scanner.nextLine();
if (inputString == null || inputString.length() == 0)
{
System.out.println("Enter the valid integer :");
return;
}
String digits = extract_Digits_Stack(inputString);
System.out.printf(digits);
}
private static String extract_Digits_Stack(String inputString)
{
String[] arrString = inputString.split("");
Stack<String> stack = new Stack<String>();
for(String input : arrString)
{
stack.push(input);
}
StringBuilder builder = new StringBuilder();
return builder.toString();
}
}
答案 0 :(得分:2)
StringBuilder builder = new StringBuilder();
return builder.toString();
这将返回一个空字符串。
答案 1 :(得分:1)
您的代码中存在一些错误/不完整的实现。
Stack
是先进先出的数据结构,在将参数推送到inputString
之前反转参数Stack
是有意义的。即如果用户输入2017
,我们会将其反转为7102
,然后将push()
反转为Stack
。示例:
2 // the forth item pushed to the stack <--- top of stack
0 // the third item pushed to the stack
1 // the second item pushed to the stack
7 // the first item pushed to the stack <--- bottom of stack
因此,当我们执行Pop()
操作时,结果将为2017
,因为:
2 is popped off the stack // append to StringBuilder (2)
0 is popped off the stack // append to StringBuilder (20)
1 is popped off the stack // append to StringBuilder (201)
7 is popped off the stack // append to StringBuilder (2017)
现在继续执行:
改变这个:
String[] arrString = inputString.split("");
到此:
String[] arrString = new StringBuilder(inputString).reverse().toString().split("");
StringBuilder
,所以让我们做一些有用的工作。示例:
StringBuilder builder = new StringBuilder();
builder.append("your digits are: ");
for (int i = 0; i < inputString.length(); i++) {
if(i == inputString.length()-1) builder.append(" and ");
builder.append(stack.pop());
if(i < inputString.length()-2) builder.append(",");
}
return builder.toString();
示例输出:
Enter an integer : 2017
your digits are: 2,0,1 and 7
注意 - 通常您应该使用Stack#empty
方法来确定Stack
中是否还有剩余元素。我使用{{{的唯一原因这里的循环只是在对元素执行for
操作时组织输出。当然还有其他方法可以达到相同的结果。
完整方法实施:
pop()
答案 2 :(得分:0)
您没有向StringBuilder
添加任何内容,因此当打印出来时,您将无法获得输出。在创建堆栈并将输入中的每个字符存储到堆栈中之后应该做的是从堆栈中一次弹出一个字符以构建输出消息。但是,问题在于您将字符存储到堆栈中的顺序。您将从输入的开头直到结束存储字符。您应该将输入结尾的字符存储起来,直到开头为止,
String[] arrString = inputString.split("");
Stack<String> stack = new Stack<String>();
for(int i = arrString.length - 1; i >= 0; i--)
{
stack.push(arrString[i]);
}
return stack;
因此,在进入2017时,堆栈现在看起来像这样
2 <-top of stack
0
1
7 <-bottom of stack
此外,像其他人一样,你的方法应该真正返回Stack<String>
,以便赋值提示更有意义。现在在main中,您可以操作此堆栈以获得输出。
Stack<String> digits = extract_Digits_Stack(inputString);
System.out.print("Your digits are ");
while(!digits.empty()){
String digit = digits.pop();
System.out.print(digit + " ");
}
答案 3 :(得分:0)
使用push
将项目推送到此堆栈的顶部之后,您应该使用pop
删除此堆栈顶部的元素并返回此值,您可以添加的值StringBuilder
使用append
。
private static String extract_Digits_Stack(String inputString) {
//To print in the same order as it is entered
//String[] arrString = new StringBuilder(inputString).reverse().toString().split("");
String[] arrString = inputString.split("");
Stack<String> stack = new Stack<String>();
for (String input : arrString) {
stack.push(input);
}
StringBuilder builder = new StringBuilder();
builder.append("The digits are: ");
while (!stack.empty()) {
builder.append(stack.pop() + ","); // Here append the elements
}
return builder.toString();
}
这将打印以逗号分隔的元素:
The digits are: 7,1,0,2,