【问题标题】:Implementing stack using data structures in C使用 C 中的数据结构实现堆栈
【发布时间】:2019-08-25 18:40:36
【问题描述】:

我正在尝试使用 C 中的数据结构实现多个堆栈。问题是我无法从 main() 函数本身执行此操作。

我创建了一个名为“stk”的自定义结构,其中包括一个整数数组、a[20] 和顶部。现在,我通过在主函数中写入“stk s”来创建一个变量“s”。然后,我使用“s.top = -1”将“top”初始化为-1。但是,一旦我使用推送功能,顶部只会增加一次,即它达到 0,无论我推送多少次,它都保持为零。我相信原因是因为我在 main() 中将 's' 声明为局部变量而不是全局变量,并且 push 函数的类型为 void,因此它停止了 top 的进一步增加。但是,如果我将它声明为全局变量,一切正常,但同样,这样做会将我限制为只有一个堆栈,因为现在,我必须在 push 函数内指定 's',因为它不会接受任何任意价值。

typedef struct
{
    int a[20];
    int top;
}stk;

stk s; 

void push(int x) //It'll only work for one stack i.e. "s"
{
    s.top++; 
    s.a[s.top] = x; 
}

int main()
{
    //I intend to declare "stk s, t" here
    s.top = -1;
}

有什么方法可以使用相同的结构来创建不同的堆栈,比如说“stk t”,但为此,我需要在 main 中将它声明为两个不同的变量,如“stk s, t”和然后使用传递值推送?

【问题讨论】:

  • 相同的结构,是的;相同的功能?不。更改您的函数以通过调用者提供的参数接受 stk 作为指针。通过地址修改从调用者传递的任何堆栈。差不多就是这样。当然,您需要初始化本地 stks。无论哪种方式,您都希望在push 中使用一些边界限制以避免溢出。
  • 所以,如果我在全局声明 stk,那么,我需要为不同的堆栈使用不同的推送函数,但它们都可以使用相同的结构,对吧?如果我在 main 中本地声明,那么,我需要一个指针吗?

标签: c stack


【解决方案1】:

通过指针向函数提供stk。这需要将push 更改为例如:

typedef struct
{
    int a[20];
    int top;
} stk;

void push(stk *s, int x)
{
    ++s->top
    s->a[s.top] = x; 
}

stk gs; // global

int main()
{
    gs.top = -1;

    stk s; // local
    s.top = -1;

    // push 42 on the local stack
    push(&s, 42);

    // push 1 on the global stack
    push(&gs, 1);
}

我将进行边界检查以避免溢出的工作留给您,也许还有一种更简洁的初始化方法。但这就是相同的函数可以修改不同堆栈的方式。

【讨论】:

  • 好吧,现在我明白了。通过 main 使用按值传递只是在 push 中增加一次,并没有在原始结构中更新它。实际上,我在讨论这个问题时并没有在这里包含边界检查功能,因为我认为这无关紧要。这一切都在实际代码中。
猜你喜欢
  • 2020-03-11
  • 2018-06-02
  • 1970-01-01
  • 2020-04-20
  • 2013-01-23
  • 2016-08-13
  • 2015-11-15
  • 2015-10-21
  • 2021-09-15
相关资源
最近更新 更多