Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm “真实世界”的用途是什么;堆栈";对象(.Net)是否已使用_Algorithm_Language Agnostic_Data Structures - Fatal编程技术网

Algorithm “真实世界”的用途是什么;堆栈";对象(.Net)是否已使用

Algorithm “真实世界”的用途是什么;堆栈";对象(.Net)是否已使用,algorithm,language-agnostic,data-structures,Algorithm,Language Agnostic,Data Structures,我们都读过或听说过stack类,但我们中的许多人可能从未找到使用LIFO对象的理由。我很想知道现实世界中使用这个对象的解决方案以及原因 我最近看到了一个例子,一个程序员在遍历分层数据源时使用堆栈跟踪他的当前位置。当他向下移动层次结构时,他将他的位置标识符推到堆栈上,当他向上移动时,他从堆栈中弹出项目。我认为这是一个非常有效的方法来跟踪他目前在mamoth层级中的位置。我以前从未见过这种情况 其他人有什么例子吗? 堆栈用于表达式计算(例如在计算器或编译器中),首先将表达式转换为表达式,然后使用简

我们都读过或听说过stack类,但我们中的许多人可能从未找到使用LIFO对象的理由。我很想知道现实世界中使用这个对象的解决方案以及原因

我最近看到了一个例子,一个程序员在遍历分层数据源时使用堆栈跟踪他的当前位置。当他向下移动层次结构时,他将他的位置标识符推到堆栈上,当他向上移动时,他从堆栈中弹出项目。我认为这是一个非常有效的方法来跟踪他目前在mamoth层级中的位置。我以前从未见过这种情况

其他人有什么例子吗?

堆栈用于表达式计算(例如在计算器或编译器中),首先将表达式转换为表达式,然后使用简单的堆栈计算机进行计算。当您看到一个操作数将其推送到堆栈上时,其工作原理如下。当看到运算符时,弹出操作数并求值

example

5 6 + 3 *

steps-
 see 5 push 5
 see 6 push 6
 see + pop 2 times and apply + get 11 push 11
 see 3 push 3
 see * pop 2 times and apply get 33 push 33

result is on the top of the stack.   

如果有递归算法,通常可以使用堆栈重写它们。(因为递归算法已经隐式地使用了堆栈)

我发现堆栈在多线程应用程序中非常有用,可以以反时间方式跟踪状态

每个线程都会在一个同步的共享堆栈中放置一条状态消息,这样您就有了一个关于所发生事情的“面包屑”


不完全是.NET,但是。。。这是我的oppinion=)

下面是一个深度比较的实现,其中堆栈用于跟踪到当前被比较对象的路径


我还在为特定xml节点生成xpath语句的类似代码中使用了它。

我在图像处理中使用了堆栈,其中“处理语言”必须在URL中指定。基于堆栈的表单允许您以易于解析、易于思考的表单表示操作树

见:


提供一个具体的例子来说明其他人的评论:要实现Z-machine解释器,应该使用三种不同的堆栈。一个调用堆栈和两个不同类型的对象堆栈。(可以找到具体的要求)注意,与所有这些示例一样,虽然使用堆栈不是严格要求的,但它是显而易见的选择


调用堆栈跟踪对子例程的递归调用,而对象堆栈用于跟踪内部项。

我使用它们跟踪撤消和重做操作

我使用这样的界面:

interface ICommand
{
    void Execute();
    void Undo();
    string Description { get; }
}
撤消和重做都属于堆栈类型。然后我为给定的动作创建一个具体的类。在类的构造函数中,我传入需要保留的任何信息
Execute
首先执行操作,然后重新执行<代码>撤消显然会撤消它。它的工作原理如下:

interface ICommand
{
    void Execute();
    void Undo();
    string Description { get; }
}
  • 撤消操作:弹出撤消堆栈并添加到重做堆栈
  • 重做撤消操作:弹出重做堆栈并再次添加到撤消堆栈
  • 执行新操作:添加到撤消堆栈并清除重做堆栈(因为状态不再一致)
我发现你必须小心,你真的在破坏已经做过的事情。例如,假设您有一个包含两个列表框的UI,每个列表框中有五个项目。您的操作可能是单击一个按钮,将左侧列表中的所有内容移动到右侧列表中(因此它现在有十个,左侧列表为零)


撤销操作不是将所有内容向后移动;撤消操作是只向后移动实际移动的五个,而保留其他的。

您可以验证需要平衡标记的字符串输入。想想LISP:

(+ (- 3 2) (+ (+ 4 5) 11))
当你击中一个开始的部分时:

stack.Push("(")
stack.Pop()
然后当你点击一个结束键:

stack.Push("(")
stack.Pop()
如果完成后堆栈中还有任何令牌,那么它是不平衡的

您可以使用fancier并验证输入(如HTML)中的正确嵌套。在一个精心设计的例子中:

//see opening body
stack.Push("body")

//see opening div
stack.Push("div")

//see opening p
stack.Push("p")

///see closing div
if(!stack.Pop().Equal("div")){
    //not balanced
}

在一次实际使用中,postscript生成器类具有“当前字体”状态,用作任何绘制文本的操作的字体。有时,函数需要临时设置字体,然后让它恢复原样。我们可以使用一个临时变量来保存和恢复字体:

def draw_body
  old_font = ps.get_font
  ps.set_font('Helvetica 10')
  draw_top_section
  draw_bottom_section
  ps.set_font(old_font)
end
但是当你第三次这样做的时候,你就不想再重复你自己了。让ps对象为我们保存和恢复字体:

class PS

  def save_font
    old_font = get_font
  end

  def restore_font
    set_font(old_font)
  end

end
现在调用者变成:

def draw_body
  ps.save_font
  ps.set_font('Helvetica 10')
  draw_top_section
  draw_bottom_section
  ps.restore_font
end
这很好,直到我们在draw_page调用的一个子例程中使用相同的模式:

def draw_top_section
  ps.save_font
  ps.set_font('Helvetica-bold 14')
  # draw the title
  ps.restore_font
  # draw the paragraph
end
当draw_top_部分调用“save_font”时,它会重击draw_页面保存的字体。是时候使用堆栈了:

def PS

  def push_font
    font_stack.push(get_font)
  end

  def pop_font
    set_font(font_stack.pop)
  end

end
在呼叫者中:

def draw_top_section
  ps.push_font
  ps.set_font('Helvetica-bold 14')
  # draw the title
  ps.pop_font
  # draw the body
end

还有进一步的改进,例如让PS类自动保存和恢复字体,但不需要进入这些类来查看堆栈的值。

在计算机图形类(不是.NET)中,我们使用堆栈来跟踪屏幕上绘制的对象。这允许每次刷新时在屏幕上重新绘制所有对象,并跟踪每个对象的顺序或“z层”,因此当它们移动时,可以与其他对象重叠。

Yeah-使用堆栈进行深度优先。您知道使用队列进行宽度优先吗?这实际上不是一个特定于.net的问题。堆栈是一种抽象数据类型,人们(可能)在每种语言中都使用它们。我一直使用堆栈。你只需要在必要的时候使用它们。这应该是一个社区维基吗?同意。不好的选择。你可以通过概括语言解释器通常使用堆栈来扩展这个答案。呃。。。我说它们用于表达式求值——因此任何进行表达式求值的操作都会使用它们,然后我给出了两个示例。因为在这个示例中,事情的顺序并不重要,所以队列也会起作用。如果您想以面包屑的方式调试事情,那么它很重要