【问题标题】:Spaghetti stack in CC 中的意大利面条堆栈
【发布时间】:2023-03-06 07:05:01
【问题描述】:

有人知道我在哪里可以找到用 C 编写的 Spaghetti stack 示例吗?

【问题讨论】:

  • +1 表示最奇怪的数据结构之一,几乎只在用于编译的符号表堆栈中有用..
  • @Jack:除了“几乎”之外,意大利面条堆栈在实现延续方面也非常有用。
  • @outis 能否详细说明 Spaghetti stack 的用途,因为我不知道为什么要使用这种数据结构?
  • @Jerky:除了要求澄清问题或答案之外,不应使用 cmets 来提出其他问题。一方面,SO 是一个问答网站,而不是论坛,并且 cmets 不适合(也不适合)讨论。如果您有超出最初询问的问题,请首先在相应的 SE 网站上检查您的问题是否已被询问,如果没有,请发布新问题。由于您询问的是数据结构概念(而不是涉及代码的实现细节),请尝试programmers.SE

标签: c data-structures


【解决方案1】:

应该是这样的:

struct stack_item;

struct stack_item
{
    stack_item *parent;
    void *ptr_data;
};

stack_item *stack_pointer = null;

void push(stack_item *item)
{
    if (stack_pointer == null)
        item->parent = null;
    else
        item->parent = cur; 

stack_pointer = item;
}

/* like push but doesn't update cur stack item to the one pushed, just add a child */
void push_parallel(stack_item *item)
{
    if (stack_pointer == null)
    {
        stack_pointer = item;
        item->parent = null;
    }
    else
        item->parent = stack_pointer;
}

stack_item *pop()
{
    if (stack_pointer == null)
    {
        printf("error: stack is empty.\r\n");
        return null;
    }

    stack_item *current = stack_pointer;
    stack_pointer = current->parent;

    return current;
}

请注意,意大利面条堆栈在您想要保留对从堆栈中弹出的事物的引用时很有用,有许多并行的链表,它们以一个共同的结尾根。所以你必须保留你弹出的项目的引用,因为你需要以 bottom-up 的方式从叶子到根遍历它们,当然使用不同的叶子节点会产生不同的链接与从其他叶子开始的其他列表具有共同元素的列表..

【讨论】:

  • push_parallel函数不应该返回一个指向栈顶的指针吗?
  • cur 只是一个错误,因为 stack_pointer 以不同的方式调用,我修复了它。对于它所依赖的 push_parallel 函数,事实是意大利面条堆栈实际上并没有一个堆栈顶部,而是根据您开始访问它的位置有很多,通常您必须自己关心堆栈外部的引用。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2011-02-04
相关资源
最近更新 更多