【发布时间】:2023-03-09 17:44:01
【问题描述】:
我正在阅读C 编程语言,并学习了如何使用堆栈制作逆波兰计算器。以下是其后的练习之一:
练习 4-4. 添加命令以打印堆栈的顶部元素而不弹出,复制它,并交换顶部 两个要素。添加清除堆栈的命令。
“重复”是什么意思?这意味着打印出整个堆栈,还是将整个堆栈压入自身(例如,“1 2 3”将变为“1 2 3 1 2 3”),还是什么?
【问题讨论】:
我正在阅读C 编程语言,并学习了如何使用堆栈制作逆波兰计算器。以下是其后的练习之一:
练习 4-4. 添加命令以打印堆栈的顶部元素而不弹出,复制它,并交换顶部 两个要素。添加清除堆栈的命令。
“重复”是什么意思?这意味着打印出整个堆栈,还是将整个堆栈压入自身(例如,“1 2 3”将变为“1 2 3 1 2 3”),还是什么?
【问题讨论】:
不,在堆栈顶部复制一个 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
【讨论】:
维基百科中的Stack-oriented programming language 条目包含对堆栈操作操作的描述:
堆栈操作
由于堆栈是面向堆栈的编程语言中数据操作的关键手段,因此这些语言通常提供某种堆栈操作运算符。常用的有dup,复制栈顶元素,exch(或swap),交换栈顶元素(第一个变成第二个,第二个变成第一个)、滚动、循环置换堆栈中或堆栈的一部分上的元素、弹出(或丢弃)、丢弃堆栈顶部的元素(推是隐式的)等。这些成为研究程序的关键。
【讨论】: