Java Stack实现水果篮程序时输入数量大于2无法连续输入的问题求助
问题分析与解决方案
嘿,我看到你遇到的问题了,咱们一步步拆解解决:
核心问题:循环条件逻辑错误
你的do-while循环条件写反啦!当前的条件是while(x == size),这意味着只有当x等于你输入的size值时,循环才会继续执行——但初始x是1,第一次循环后x就变成2了,这时候如果size大于2,x肯定不等于size,循环直接终止,自然只能输入一次水果。
正确的逻辑应该是:只要x还没超过设定的水果数量,就继续循环。所以循环条件应该改成while(x <= size)(或者while(x < size + 1),效果完全一致)。
额外优化建议
还有个小细节:你的switch只处理小写的a/o/m/g,如果用户输入大写字母(比如A)或者带空格的输入,就不会被识别,水果也不会加入栈里。可以把输入的字符串转成小写,同时去掉首尾空格,让程序更健壮。另外还可以加个default分支处理无效输入,避免用户输错后直接跳过次数。
修正后的完整代码
import java.util.Scanner; import java.util.Stack; public class FruitBasket { public static void main(String[] args) { Scanner scan = new Scanner(System.in); Stack<String> fruits = new Stack<String>(); System.out.println("Catch and Eat any of these Fruits: ('Apple' , 'Orange' , 'Mango' , 'Guava' ) "); System.out.print("How many fruit would you like to catch?"); int size = scan.nextInt(); System.out.println("Choose a fruit to catch. Press A , O , M or G."); scan.nextLine(); // 吃掉nextInt()留下的换行符,避免读取空字符串 int x = 1; do { // 转小写+去空格,兼容更多输入情况 String input = scan.nextLine().toLowerCase().trim(); System.out.println("Fruit " + x + " of " + size + ": " + input); switch(input) { case "a": fruits.add("Apple"); break; case "o": fruits.add("Orange"); break; case "m": fruits.add("Mango"); break; case "g": fruits.add("Guava"); break; default: // 处理无效输入,提示用户重新输入,同时回退x避免跳过次数 System.out.println("Invalid input! Please enter A, O, M, or G."); x--; break; } x++; } while(x <= size); // 修正循环条件:只要x还没超过设定数量就继续 System.out.println("Your basket now has: " + fruits); System.out.println(); // 空行分隔结果 } }
原循环失效的原因再梳理
举个例子,假设你输入size=3:
- 初始x=1,第一次执行do块后x变成2
- 进入while判断:
2 == 3?不成立,循环直接结束 - 结果只执行了1次,根本没机会输入剩下的2个水果
改成x <= size后,逻辑就通顺了:
- x=1执行后变2,2<=3 → 继续循环
- x=2执行后变3,3<=3 → 继续循环
- x=3执行后变4,4<=3 → 停止循环,刚好执行了3次,完美匹配你输入的水果数量
内容的提问来源于stack exchange,提问作者Pablo Job
相关产品推荐
相关产品推荐

