我的编程语言没有数组,没有列表,没有指针,没有eval,也没有变量变量。它只有:
普通变量就像你从大多数编程语言中知道的那样:它们都有一个确切的名称和值。
一个堆栈。提供的函数是:push(将元素添加到顶部),pop(从顶部删除元素,获取值)和空(检查堆栈是否为空)
我的语言很完整。 (基本算术,条件跳转等实现)这意味着,必须可以实现某种列表或数组,对吗?
但我不知道如何......
我想要实现的目标:创建一个可以检索和/或更改堆栈元素x的函数。
我可以在解释器中轻松地将这个函数添加到我的语言实现中,但是我想用 编写我的编程语言。
创建一个循环。从堆栈顶部x
次弹出元素。弹出的最后一个元素是元素编号x
。我最终得到了一个被破坏的堆栈。
执行与上述相同的操作,但将所有弹出的值存储在第二个堆栈中。然后你可以在完成后移回所有元素。但你知道吗?我没有第二个堆栈!
答案 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)
如果你只有一个堆栈,这相当于一个可以识别无上下文语言的下推自动机,并且不是图灵完备的。您的图灵完整性证明应告知您如何实现自由形式的内存访问。
通常,为了证明图灵完整性,您必须能够展示您的语言如何在磁带上从左到右移动(或间接模拟此过程),这大致对应于单个更高级别的数组。