Language agnostic 使用堆栈实现阵列

Language agnostic 使用堆栈实现阵列,language-agnostic,arrays,stack,Language Agnostic,Arrays,Stack,我的编程语言没有数组、列表、指针、eval和变量。它所拥有的一切: 像您从大多数编程语言中了解的普通变量:它们都有一个确切的名称和值 一个堆栈。提供的函数有:push(将元素添加到顶部)、pop(从顶部移除元素,获取值)和empty(检查堆栈是否为空) 我的语言是图灵完整的。(实现了基本算术、条件跳转等)这意味着,必须能够实现某种列表或数组,对吗 但我不知道如何… 我想要实现的是:创建一个函数,它可以检索和/或更改堆栈的元素x 我可以很容易地在我的语言实现中,在解释器中添加这个函数,但是我想

我的编程语言没有数组、列表、指针、eval和变量。它所拥有的一切:

  • 像您从大多数编程语言中了解的普通变量:它们都有一个确切的名称和值

  • 一个堆栈。提供的函数有:push(将元素添加到顶部)、pop(从顶部移除元素,获取值)和empty(检查堆栈是否为空)

我的语言是图灵完整的。(实现了基本算术、条件跳转等)这意味着,必须能够实现某种列表或数组,对吗

但我不知道如何…

我想要实现的是:创建一个函数,它可以检索和/或更改堆栈的元素x

我可以很容易地在我的语言实现中,在解释器中添加这个函数,但是我想用我的编程语言来实现它

  • “解决方案”一(访问元素x,从堆栈顶部开始计数)
创建一个循环。从堆栈顶部弹出元素
x
次。最后弹出的元素是元素编号
x
。我最终得到的是一堆被毁的东西

  • 解决方案二:

执行与上面相同的操作,但将所有弹出的值存储在第二个堆栈中。完成后,可以将所有元素向后移动。但是你知道吗?我没有第二堆了

有过程调用和递归吗?然后你有第二个堆栈,调用堆栈。如果不是,你确定它是图灵完整的,而不仅仅是一个PDA吗?

听起来像是一个家庭作业问题,因为它展示了计算机科学的随机部分

我想您应该使用递归来实现这一点。假设我有这样的东西

Queue globalQueue = new Queue();
然后我可以得到这样的代码,得到元素X

public Object findElement(stepsToTake s) {

    if (queue.empty()) {
        throw new EmptyQueueYouFailException();
    }

    Object o = queue.pop();


   if (s == 0) {
        queue.push(o);
        return o;
    }

    Object actualResult = findElement( s - 1 );
    //restore this element to the stack
    queue.push(o);
    //return actual result
    return actualResult;
}
所以我很可能犯了一些错误。。。没有想得很透彻。特别担心我会因为调用的顺序而对堆栈重新排序


希望这能让您正确思考以获得解决方案?

如果您只有一个堆栈,这相当于一个下推自动机,它可以识别上下文无关的语言,并且不是图灵完整的。图灵完整性证明应该告诉您如何实现自由形式内存访问


一般来说,为了证明图灵完整性,您必须能够展示您的语言如何在磁带上从左向右移动(或间接模拟此过程),磁带大致对应于一个更高级别的数组。

听起来像是
Forth
:Forth有指针和分配(分配给它数组)还有第二个堆栈。我有一个调用堆栈,是的,但它不能从内部语言访问。它是解释器的内部部分,不需要直接访问。如果你的过程可以有局部变量并支持递归,你可以使用它们来恢复堆栈。当然,只要在堆栈上递归,在递归时弹出,在返回时按下即可。然而,在你的问题中说你只有一个堆栈是有点误导的。没有递归,没有局部变量:)好吧,我从顶部抓起o。。然后,无论是基本情况还是递归情况,都会重新启用o。我不认为我的algo会丢失任何o,但是我还没有考虑操作系统在之前和之后的顺序。谢谢你的代码示例,我想我现在知道该怎么做了。顺便问一下:你为什么认为这是家庭作业?我是说。。。我既没有提到特定的编程语言,也没有要求提供代码!但是,您的代码示例不适用于我的语言:它没有作用域,因此变量o将被下一次函数调用覆盖。由于语言没有变量,这有点棘手,嗯?嗯,除了在计算机科学课上教你像计算机一样思考之外,很少有人会使用一种功能如此有限的语言:)在任何“真正”的语言中,查看队列中的项目X都非常简单。是的,我还以为这也是家庭作业。我看不出除了逻辑谜题(如果它是一个逻辑谜题,我看不出没有理由不明确地说出来)之外还能有什么。奇怪的是,这是一个理解“对数组的任何支持”意味着什么的问题。lambda演算没有数组作为基元,但是您当然可以从它提供给您的基元中创建数组(好的列表,数组通常被理解为暗示关于实现的某些事情,以及最终关于硬件的某些事情)。@Zack“但是,通过将函数链接在一起,您可以模拟类似于列表的线性数据结构。”--从这个问题开始。如果您关于单个堆栈的说法是正确的,您将如何使用这种语言来实现这一点?