如何在 C# 中构建一个将整数计算为 LIFO 集合的函数

fad*_*ees 5 c# stack

问题是:编写一个函数 (AllExist),它接收一个非空堆栈 stk (int) 作为参数,如果堆栈中每个数字的所有第一个数字都作为最后一个数字出现,它将返回 true stk的个数,否则返回false。例如:对于stk(从顶部开始向下)122、251、565、12334、28、7。该函数将返回true。1 、 2 、 5 和 7 作为堆栈中任何数字的最后一位出现。

** clone 是一个函数,它返回与给定堆栈相同的堆栈。

我的建议:

public static bool AllExist(stack<int> stk)
{
  int x=0; int i; int z; bool bl; string str;
  stack <int> stk1=clone (stk);
  while (!stk1.IsEmpty())
  {
    i=stk1.Pop();
    while(i>=10)
    i/=10;
    x=x*10+i;
  }
 str=x.ToString();
 stack<int> stk2=Clone(stk);
 while(!stk2.IsEmpty())
 {
   z=stk2.Pop()%10;
   if (str.IndexOf(z.ToString())>-1)
     bl=true;
   bl=false;
 }
return bl;
}
Run Code Online (Sandbox Code Playgroud)

** 这都是翻译,如有任何误解,敬请谅解。

谢谢你!

Vla*_*hov 1

您可以使用 LINQ 解决此问题,例如:

static void Main(string[] args)
{
     Console.WriteLine(AllExist(new Stack<int>(new List<int>() { 122, 251, 565, 12334, 28, 7 })));
}

public static bool AllExist(Stack<int> stk) => stk.All(
     firstDigitItem => stk.Where(
          lastDigitItem => lastDigitItem.ToString().Last() == firstDigitItem.ToString().First())
     .Count() > 0);
   
Run Code Online (Sandbox Code Playgroud)

怎么运行的:

  • 使用 stk.All() 如果集合中的所有项目都满足条件,您将返回 true。
  • 然后我们从集合中选择一个项目 - firstDigitItem 并开始将该项目的第一个数字与集合中的每个其他最后一个数字项目进行比较。使用 .ToString().First() 或 .ToString().Last()
  • 如果超过 0 个元素满足我们的条件 - 我们继续检查其他项目。
  • 否则:“Where”返回 false,“All”自动返回 false。

或者更优化的方式:

public static bool AllExist(Stack<int> stk) => stk.All(
     firstDigitItem => 
          stk.Any(lastDigitItem => lastDigitItem.ToString().Last() == firstDigitItem.ToString().First()));
Run Code Online (Sandbox Code Playgroud)

在这里,使用“Any”,我们仅查找满足我们谓词的第一个元素,而不是所有“Where”元素。