首页 > 解决方案 > C# Stack 想问他们想吃哪种水果

问题描述

我在这个程序中的目标是将用户想要吃的每个水果推入堆栈并弹出每次输入的最后一个水果 E 表示他们现在想吃,每次用户输入 E 时它都会显示堆栈内容和它如果堆栈已经为空,将显示一条消息。代码不起作用。如何连续添加水果并检查堆栈是否为空?

Stack<string> st = new Stack<string>();    
Console.WriteLine("A: Apple");
Console.WriteLine("O: Orange");
Console.WriteLine("M: Mango");
Console.WriteLine("G: Guava");
Console.WriteLine("E: If you want to eat now the fruit");

do { 
    Console.Write("Enter your choice: ");
    string choice = Console.ReadLine();
    char fruit = char.Parse(choice);

    if (fruit == 'A'){
        st.Push("Apple");
    }
    else if (fruit == 'O'){
        st.Push("Orange");  
    }
    else if (fruit == 'M'){
        st.Push("Mango");
    }
    else if (fruit == 'G'){
        st.Push("Guava"); 
    }
    else if (fruit == 'E'){
        st.Pop(); 
        foreach (Object obj in st){
            Console.WriteLine(obj);
        }
    }
    else {
        Console.WriteLine("Invalid input");
    }
    Console.WriteLine("\nDo you want to try again? (Y/N)");
}
while(!Console.ReadLine().Equals('N'));

标签: c#loopsif-statementstack

解决方案


一个可能的原因是choicenull这会引发ArgumentNullException您在通话中遇到的异常char.Parse)。Console.ReadLine可以返回的事实null(如果您在控制台上按 Ctrl-Z)经常被忽略。

这意味着:

string choice = Console.ReadLine();
char fruit = char.Parse(choice);

应该可能是:

string choice = Console.ReadLine();
char fruit = char.TryParse(choice, out var result) : result : 'P'; // P meaning invalid input

和:

while (!Console.ReadLine().Equals('N'));

应该是:

while (Console.ReadLine() != "N");

推荐阅读