我需要检查堆栈中是否有重复项(仅在基本方法pop、push、top、isempty中使用),如果堆栈没有重复项,则返回true;如果堆栈为空,则返回true;如果堆栈有重复项,则返回false
public static bool CheckStack(Stack<int> s, int x)
{
Stack<int> s1 = new Stack<int>();
bool flag = false;
if (s.IsEmpty())
return false;
while (!s.IsEmpty() && ! flag)
{
int temp = s.Pop();
s1.Push(temp);
if (temp == x)
flag = true;
}
s = s1;
return flag;
}
public static bool SpecialStack(Stack<int> s)
{
int temp = s.Pop();
while(!s.IsEmpty() && !CheckStack(s,temp))
{
temp = s.Pop();
}
if (s.IsEmpty())
return true;
return false;
}
public static void Main()
{
Stack<int> st3 = new Stack<int>();
st3.Push(7);
st3.Push(2);
st3.Push(1);
st3.Push(8);
st3.Push(7);
Console.WriteLine(SpecialStack(st3));
}
如果不使用另一个函数和最短路径,我如何做到这一点?解决方案需要使用基本方法,而不使用c的内置函数#
问题#1:堆栈已清除
关于代码本身,乍一看,我们需要:
bool CheckStack (ref Stack<int> s, int x)
要恢复堆栈,否则需要重新考虑设计,因为原始的在方法的末尾是空的,所以在返回之后。
在C中通过引用或值传递对象#
按引用传递引用类型(C#编程指南)
问题2:堆栈已还原
还可通过弹出和推送将原始堆栈还原在浅拷贝中。
后进先出
问题#3:SpecialStack
我怀疑这种方法,除非目标是一次清空堆栈中的一个项目,并在每次迭代中调用CheckStack,直到没有更多的项目为止。
简单的Linq解决方案
我们可以使用Linq Distinct并比较每个计数
:
Console.WriteLine(st3.Distinct().Count() != st3.Count);
因此,如果计数匹配,则没有重复项,否则会有一些重复项。
通用扩展方法的改进
static public class StackHelper
{
static public bool HasDuplicates<T>(this Stack<T> stack)
{
return stack.Distinct().Count() != stack.Count;
}
}
Console.WriteLine(st3.HasDuplicates()); // True
解决方案不使用除Pop、Push、Contains和Count以外的任何其他方法
static public bool HasDuplicates<T>(this Stack<T> stack)
{
// Check for duplicates
bool nodup = true;
var temp = new Stack<T>();
while ( stack.Count != 0 )
{
var item = stack.Pop();
if ( nodup && temp.Contains(item) ) nodup = false;
temp.Push(item);
}
// Restore original stack
while ( temp.Count != 0 )
{
stack.Push(temp.Pop());
}
return !nodup;
}
注意:T
可以替换为int
以删除泛型,并且可以根据需要声明方法、扩展与否、静态或实例。。。
我知道Java通过扩展Vector搞砸了栈实现。默认情况下,矢量是同步的。阅读java文档,它说要创建一个堆栈, 因为我对java比较陌生。我的问题是:这是在Java中定义堆栈的最佳实践吗?
我在SO上发现了许多类似问题的例子,但不幸的是,没有一个答案符合我的要求。 我对纵向和横向有不同的布局,并且我使用了后退堆栈,这既阻止了我使用又阻止了使用配置更改例程的技巧。 我在TextViews中向用户显示某些信息,这些信息不会保存在默认处理程序中。在单独使用活动编写应用程序时,以下操作非常有效: 对于s,这只在非常特定的情况下起作用。具体地说,最可怕的是替换一个片段,把它放在后面的堆栈中,然
问题内容: 我在SO上发现了许多类似问题的实例,但不幸的是,没有答案符合我的要求。 我对人像和风景有不同的布局,并且我使用的是后向堆栈,这既妨碍了我的使用,又使我无法使用配置更改例程。 我在TextViews中向用户显示某些信息,这些信息不会保存在默认处理程序中。当仅使用“活动”编写我的应用程序时,以下方法运行良好: 使用,这仅在非常特殊的情况下有效。具体地说,令人震惊的是替换片段,将其放回堆栈中
问题内容: 我有一个需要用户输入密码的应用程序。 我想要做的是从控制台读取密码(如果操作系统支持unix)或显示JOptionPane并要求用户输入密码(如果操作系统支持图形界面(例如Windows))。 有人可能会争辩说,在上述两种情况下控制台始终可用,因此控制台输入就足够了。但是问题是,如果Java应用程序开始使用javaw.exe,则控制台不可用。因此,我需要一种方法来确定我是否可以做任何一
问题内容: 如何在Python中管理变量和内存?它有堆栈和堆吗?用于管理内存的算法是什么?有了这些知识,对于大量/数据处理的内存管理有什么建议吗? 问题答案: 如何在Python中管理变量和内存。 自动地!不,真的,您只是创建一个对象,Python虚拟机将处理所需的内存以及将其放置在内存布局中的位置。 它有堆栈和堆吗?用于管理内存的算法是什么? 当我们谈论它时,使用 私有堆 来存储对象。从CPyt
问题内容: 在JMS中,很容易找出连接是否丢失,是否发生异常。但是,如何确定连接是否再次存在? 场景:我使用JMS与服务器通信。现在我的连接断开了(服务器已关闭),这导致了异常。到目前为止,一切都很好。如果服务器再次启动并重新建立连接,我怎么知道? 我看不到任何可以提供此类信息的侦听器。 问题答案: 啊…旧的异常处理/重新连接难题。 有些传输提供程序将为您自动重新连接您的应用程序,而另一些传输提供