【问题标题】:Linked stacks and queues链接堆栈和队列
【发布时间】:2019-03-07 18:38:40
【问题描述】:

在一本书中遇到了链接堆栈和队列(它不是使用链接列表的堆栈/队列实现)。 它说如果我们只有一个堆栈/队列,则可以顺序表示堆栈/队列。但是,当多个堆栈/队列共存时,则没有有效的方法来顺序表示它们。 下面是给出的代码

#define MAX_STACKS 10 //maximum number of stacks;
typedef struct {
        int key;
        //other fields.
}element;
typedef struct stack *stackpointer;
typedef struct {
        element data;
        stackpointer link;
}stack;
stackpointer top[MAX_STACKS];

void push(int i ,element item) {
     stackpointer temp;
     malloc(temp,sizeof(*temp));
     temp->data = item;
     temp->link = top[i];
     top[i] = temp;
}

我是数据结构的新手。我可以简单解释一下上述概念,即 Linked Stacks/Queues。

【问题讨论】:

  • 不清楚你在这里问什么。您是否要求解释如何使用链表来实现堆栈或队列?
  • 其实是使用链表的栈实现,但是如何用链表实现两个或多个栈,让所有栈都链接起来。
  • 你是什么意思,“所有的堆栈都链接了?”
  • 检查 push() 代码,如果你能理解这个概念是什么
  • 您对malloc 的调用是错误的。应该是temp = malloc(sizeof(*temp))。你的push 很清楚。我仍然不知道您所说的“堆栈已链接”是什么意思。很难理解你在问什么,因为我们没有这本书的上下文。您说“没有有效的方法来顺序表示它们”是正确的:您不能在单个链表中有多个堆栈,并且仍然可以有效地访问它们。你的评论“如果你能理解这个概念是什么”是相当屈尊的。问题是你的问题不清楚,而不是我不聪明。

标签: c data-structures linked-list stack queue


【解决方案1】:

所以我看了你的书,我有点明白你的问题是什么。

如果我们只有一个堆栈或一个队列,这种表示被证明是有效的。但是,当多个堆栈和队列共存时,没有有效的方法来顺序表示它们

所以,对于顺序,你必须理解它意味着使用数组来表示堆栈而不是链表。现在只需假设您有一个由 10 个数组组成的矩阵来表示每个大小为 100 的数组,并且您将一些数据推送到每个数组中。假设您在每个堆栈中只推送几个元素,最终会浪费大量数据,因为矩阵中有 1000 个元素。使用单个数组时会出现此问题,但当您有多个数组用于多个堆栈时,它会变得更加明显。

现在您可能已经理解了,使用堆栈的链表表示会根据需要使用尽可能多的内存,而跟踪下一个元素(在本例中为堆栈指针链接)只需少量开销。

stackpointer top[MAX_STACKS]

所以我们在这里所做的是创建一个堆栈指针类型的数组来跟踪每个单独堆栈的顶部位置。所以现在每当用户希望输入一个元素时,他们必须传递索引(int i)以及数据(元素项)。

void push(int i ,element item) 
{
     stackpointer temp;
     malloc(temp,sizeof(*temp));
     temp->data = item;
     temp->link = top[i];
     top[i] = temp;
}

所以我们要做的是创建一个临时变量来存储我们的数据,它现在将成为我们堆栈的顶部,但在这样做之前我们必须将它指向之前的堆栈顶部,(在第 5 行中完成)和在第 6 行,我们只是将 top[i] 指向 temp。 但是,您可能想用这个来更正您的代码

stackpointer temp = (stackpointer)malloc(sizeof(element));

如果您对malloc有疑问,请参考this。 如果您有任何疑问,请告诉我,我会澄清您需要的任何内容。

【讨论】:

  • 谢谢。我理解了这个概念,但是 temp 的大小应该与 stackpointer 相同,因为 temp 是 stackpointer 类型的指针变量。 Stackpointer temp = (stackpointer)malloc(sizeof(stackpointer)) 不正确吗??
  • stackpointer 是一个元素指针,如果你使用 Stackpointer temp = (stackpointer)malloc(sizeof(stackpointer)) ,那么你正在创建一个指向我们不想要的指针的指针。跨度>
  • @PraveenParihar,嘿伙计,这是一个奇怪的要求,但我在回答问题时被禁止访问该网站。您能否帮助我,因为投票可能会让我有更好的机会对上述决定提出上诉?
猜你喜欢
  • 2015-11-16
  • 2013-09-18
  • 2015-05-15
  • 2014-07-21
  • 2021-04-29
  • 1970-01-01
  • 2021-03-17
  • 2014-04-21
  • 2015-09-19
相关资源
最近更新 更多