【问题标题】:What does it mean to duplicate a stack?复制堆栈是什么意思?
【发布时间】:2023-03-09 17:44:01
【问题描述】:

我正在阅读C 编程语言,并学习了如何使用堆栈制作逆波兰计算器。以下是其后的练习之一:

练习 4-4. 添加命令以打印堆栈的顶部元素而不弹出,复制它,并交换顶部 两个要素。添加清除堆栈的命令。

“重复”是什么意思?这意味着打印出整个堆栈,还是将整个堆栈压入自身(例如,“1 2 3”将变为“1 2 3 1 2 3”),还是什么?

【问题讨论】:

    标签: c stack


    【解决方案1】:

    不,在堆栈顶部复制一个 individual 元素更有意义。我怀疑“打印顶部元素”是一个错字,应该是单数的“打印顶部元素”。

    原因这更有可能是因为打印“顶级元素”本身没有任何意义。如果它是堆栈的某个子集,而不仅仅是顶部元素,则需要指定一个计数(但它不需要),或者,如果它意味着它们全部,则根本不需要“顶部”限定符。

    这意味着主语“it”,在这种情况下,指的是“堆栈的顶部元素”,而不是“堆栈”。

    所以如果你的堆栈是:

    [1,2,3,4,5]
    

    1 是被推送的 第一个 元素,5 是最后一个被推送的元素,复制会给你:

    [1,2,3,4,5,5].
    

    假设您已经有了基本操作push 和pop,您可能需要添加count 和peek,这将分别为您提供当前元素计数和堆栈的顶部元素(基本上pop 但不删除它)。

    然后可以从这些基本操作(伪代码)构建其余代码,例如:

    def printTop(stack):
        print stack.peek()
    
    def duplicateTop(stack):
        stack.push(stack.peek())
    
    def swapTopTwo(stack):
        one = stack.pop()
        two = stack.pop()
        stack.push(one)
        stack.push(two)
    
    def clear(stack):
        while stack.count() > 0:
            junk = stack.pop()
    

    这可能是实现它们的最简单的方法,尽管如果你编写函数并假设你有更多的权力而不只是调用基本操作,那么可能会提高效率。例如,您可以 swapTopTwo 只需在原地交换两个元素而不是弹出和推送(以 _ 开头的变量是以下实现的内部变量):

    def swapTopTwo(stack):
        if stack._count < 2: raise error
        temp = stack.data[_count - 2]
        stack.data[_count - 2] = stack.data[_count - 1]
        stack.data[_count - 1] = temp
    

    【讨论】:

      【解决方案2】:

      维基百科中的Stack-oriented programming language 条目包含对堆栈操作操作的描述:

      堆栈操作

      由于堆栈是面向堆栈的编程语言中数据操作的关键手段,因此这些语言通常提供某种堆栈操作运算符。常用的有dup,复制栈顶元素,exch(或swap),交换栈顶元素(第一个变成第二个,第二个变成第一个)、滚动、循环置换堆栈中或堆栈的一部分上的元素、弹出(或丢弃)、丢弃堆栈顶部的元素(推是隐式的)等。这些成为研究程序的关键。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 2010-09-07
        • 2010-09-15
        • 1970-01-01
        • 2011-05-30
        • 2015-05-14
        相关资源
        最近更新 更多