我的程序没有打印预期的输出

时间:2017-04-25 16:06:17

标签: java stack

这是我给出的任务:

  

编写一个程序,要求用户输入一个整数,然后逐个输出该整数的数字。例如,如果用户输入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();
  }
}

4 个答案:

答案 0 :(得分:2)

StringBuilder builder = new StringBuilder();
return builder.toString();

这将返回一个空字符串。

答案 1 :(得分:1)

您的代码中存在一些错误/不完整的实现。

  1. 考虑到Stack是先进先出的数据结构,在将参数推送到inputString之前反转参数Stack是有意义的。即如果用户输入2017,我们会将其反转为7102,然后将push()反转为Stack
  2. 示例:

    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("");
    
    1. 你正在返回一个空的StringBuilder,所以让我们做一些有用的工作。
    2. 示例:

      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,