我创建了两个程序,每个程序都有相同的任务。我创建一个最多10个元素的堆栈。当你写' +'这意味着接下来,您将在新行中插入一些数字到堆栈中。如果操作成功执行,程序将写入行:':)'。如果堆栈溢出,程序将写入行:':('。如果您插入' - '这意味着程序从堆栈中删除最后一个元素并在控制台中打印该元素。如果堆栈为空并且您插入' - '程序显示您:':('。
示例输入:
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
0
+
1
-
-
-
-
-
-
-
-
-
-
-
输出:
:)
:)
:)
:)
:)
:)
:)
:)
:)
:(
0
9
8
7
6
5
4
3
2
1
:(
我用两种方式解决了这个问题; 第一个代码: http://ideone.com/WNiNik#comments
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int>();
for (; ; )
{
char sign = char.Parse(Console.ReadLine());
switch (sign)
{
case '+':
{
if (list.Count >= 10) Console.WriteLine(":(");
else
{
int number = int.Parse(Console.ReadLine());
list.Add(number);
}
break;
}
case '-':
{
if (list.Count == 0) Console.WriteLine(":(");
else
{
Console.WriteLine(list[list.Count - 1]);
list.Remove(list[list.Count - 1]);
}
break;
}
}
}
}
}
第一个代码在Windows上运行良好,但在ideone.com上不起作用。
第二个代码: http://ideone.com/InDjF4
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int>();
string x;
while (((x = Console.ReadLine())) != null)
{
char sign = char.Parse(x);
switch (sign)
{
case '+':
{
if (list.Count >= 10) Console.WriteLine(":(");
else
{
int number = int.Parse(Console.ReadLine());
list.Add(number);
Console.WriteLine(":)");
}
break;
}
case '-':
{
if (list.Count == 0) Console.WriteLine(":(");
else
{
Console.WriteLine(list[list.Count - 1]);
list.Remove(list[list.Count - 1]);
}
break;
}
}
}
}
}
第二代码在Windows和ideone.com上运行良好。我通过反复试验的方法来解决这个问题。有人可以解释一下为什么我的第一个代码出错了,这两个代码有什么区别?
答案 0 :(得分:2)
这就是问题所在:
for (; ; )
{
char sign = char.Parse(Console.ReadLine());
...
}
这将永远循环 - 代码中没有任何内容可以完全打破循环。
但是,Console.ReadLine()
会在到达输入结束时返回null
,此时您正在调用char.Parse(null)
,这会抛出异常。
你需要弄清楚如何干净地结束程序。
如果您将输入放入文件(例如input.txt
)然后运行
Program < input.txt