使用堆栈实现数组

时间:2010-05-02 15:50:16

标签: language-agnostic arrays stack

我的编程语言没有数组,没有列表,没有指针,没有eval,也没有变量变量。它只有:

  • 普通变量就像你从大多数编程语言中知道的那样:它们都有一个确切的名称和值。

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

我的语言很完整。 (基本算术,条件跳转等实现)这意味着,必须可以实现某种列表或数组,对吗?

但我不知道如何......

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

我可以在解释器中轻松地将这个函数添加到我的语言实现中,但是我想用 编写我的编程语言。

  • “解决方案”一个(访问元素x,从堆栈顶部开始计算)

创建一个循环。从堆栈顶部x次弹出元素。弹出的最后一个元素是元素编号x。我最终得到了一个被破坏的堆栈。

  • 解决方案二:

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

3 个答案:

答案 0 :(得分:3)

听起来像是一个家庭作业问题,因为它会随机改变计算机科学......

我认为你会想要使用递归来做到这一点。说我有这样的东西..

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;
}

所以我更有可能犯了一些错误......没想到它超级好。特别担心我会因为我的电话顺序而重新排序堆栈。

希望这可以帮助您思考正确的方法来获得解决方案吗?

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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