【问题标题】:Implement an array of stacks in C在 C 中实现堆栈数组
【发布时间】:2010-12-15 19:24:14
【问题描述】:

实现一个堆栈数组,其中定义了堆栈:

typedef struct StackNode {

   int data;

   StackNode* next;

} StackNode;

每个数组元素都指向一个栈,每个栈初始化为一个空栈。 当您开始添加元素时,它将开始将它们添加到 Stacks[0]; 的堆栈中 例如,如果您在 stdin 中输入 -2,然后输入 4,则下一个条目将转到 Stacks[4];

例如:

5 10 -2 3 9 7 89 -1
will result in :
Stacks[0] -> 10 -> 5
Stacks[1]
Stacks[2]
Stacks[3] -> 89 -> 7 -> 9

-1 将停止代码运行。

我在实现堆栈数组时遇到了问题,因此我们将不胜感激:)

【问题讨论】:

  • 这不是家庭作业,但它是我正在编写的代码的一部分,我正在努力尽快完成它。我想除了实现数组的想法外,我什么都理解。因此,如果这种方式只是一个用于推送和弹出元素的堆栈,那将很容易。感谢您的回复:)
  • 你能贴出实际在结构上运行的代码吗?或者你有问题甚至开始?我认为这可能需要 homework 标签,正如 jinguy 建议的那样。
  • 就算不是作业?
  • @c2009l123:抱歉,我在您向 Rom 写回复时发布了该评论,所以直到发表评论后我才看到它。

标签: c arrays data-structures stack


【解决方案1】:
int t = 0, index = 0;
while(t != -1)
{
  scanf("%d", &t);
  if(t == -2)
  {
    scanf("%d", &t);
    index = t;
    continue;
  }
  if(t >= 0)
    push(stacks[index], t);
}

【讨论】:

  • 和 push 函数就像 push(StackNode *tp, int t) 对吧?我的意思不是 StackNode *tp[int i] 或类似的东西?
  • 如果stacks 是一个指向 StackNode 对象的指针数组,是的,你的 push 函数签名是正确的。
【解决方案2】:

在第 3 行

typedef struct StackNode {
   int data;
   StackNode* next;          /* line 3 */
} StackNode;

StackNode 类型尚不存在。 StackNode 类型只有在 struct StackNode 类型被完全解析后才开始存在。

但此时struct StackNode 类型已经存在。它仍然不完整,但您可以声明指向它的指针。

typedef struct StackNode {
   int data;
   struct StackNode* next;          /* line 3 */
} StackNode;

【讨论】:

  • 这不是我面临的问题。例如你可以: StackNode *Stacks[10];创建一个大小为 10 的堆栈数组。但是我在执行诸如推送到数组中的特定数字之类的操作时遇到问题。
【解决方案3】:

您可以尝试以下方法(已测试):

//includes
#define SIZE 10


typedef struct StackNode{
 int data ;
 struct StackNode* next ;
}StackNode ;



StackNode* new_stackNode(int num)
{
 StackNode* ptr = (StackNode*)malloc(sizeof(StackNode)) ;
 ptr->data = num ;
 ptr->next = 0 ;
 return ptr ;
}



int main()
{
 StackNode *arr[SIZE] = {0};
 int st_index = 0 ;
 int num = 0 ;
 while(num != -1)
 {
  scanf("%d",&num);
  if( num == -2 )
  st_index++ ;
  else
  {
   StackNode* ptr = new_stackNode(num) ;
   ptr->next = arr[st_index] ;
   arr[st_index] = ptr ;
  }
 }
}

【讨论】:

    【解决方案4】:

    如果您转到this Wikipedia article 的底部,您会看到我认为您正在尝试实施的示例。你所拥有的是一个链表。此外,这里有一些方便的doubly linked list helpers 可以作为示例。

    如果您按原样发布代码的实际使用情况,您可能会收到更好(更具体)的答案。

    【讨论】:

      【解决方案5】:

      你必须先得到一个StackNodes的数组:

      StackNode ** stacks = malloc(sizeof(StackNode*) * 5); /* allocate 5 stack nodes */
      stacks[0] = malloc(sizeof(StackNode)); /* allocate first stack */
      ...
      

      现在你有一个函数push(StackNode *, int value)。要压入某个堆栈,请使用push(stacks[2], value) 调用它(例如,压入第三个堆栈)。

      【讨论】:

      • 我需要一件一件地做吗?如果我有 100 个堆栈,我会循环遍历它们吗?这似乎有点低效
      【解决方案6】:

      这看起来不像堆栈,它看起来像一个链表。当然,你可以使用链表来实现类似栈的语义,但一般不是“栈”的意思。

      要推送新号码,您需要:

      • 分配一个新的StackNode。
      • 使用新号码对其进行初始化。
      • 将其链接到上一个。

      你可以把它封装成一个函数:

      void stack_push(StackNode *root, int value)
      {
          /* Code omitted */
      }
      

      那么您只需要提供适当的堆栈,以便控制将新数字推送到多个堆栈中的哪一个:

      stack_push(&Stacks[2], 4711);
      

      【讨论】:

      • 我已经做到了,但是如何将数字推送到与数组中特定数字链接的特定堆栈。例如,我想将数字 (3) 推送到 Stacks[5] 或从 Stacks[2] 中弹出一个数字
      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 2016-07-05
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      相关资源
      最近更新 更多