【问题标题】:C: How do I check if a bi-dimensional array is empty and how to delete an element in sai array?C:如何检查二维数组是否为空,如何删除sai数组中的元素?
【发布时间】:2020-12-14 14:15:28
【问题描述】:

我已经以这种方式声明了数组:

static char **stack;

我有一个将元素推入数组/堆栈的函数。

int push(const char *s) {
  if (p >= stack + size)
    return 0;
  *p++ = (char *)s;
  return 1;
}

在哪里

static char **p;
static size_t size;
p = stack;
size = mem_size / sizeof(char *);

但是,如何检查二维数组是否为空?我应该如何从堆栈中弹出一个元素?

【问题讨论】:

标签: c pointers stack pointer-to-pointer


【解决方案1】:

你可以这样做:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

static char **stack;
static char **p;
static size_t size;

int
push (const char *s)
{
  if (p >= stack + size)
    return 0;
  *p++ = (char *) s;
  return 1;
}

char *
pop (void)
{
  if (p == stack)
    {
      return 0;
    }
  char *s = *(--p);
  *p = 0;
  return s;
}

void
print_stack (char **stack_to_print)
{
  char **temp = stack_to_print;
  while (*temp != NULL)
    {
      printf ("%s \n", *temp);
      temp++;
    }
}

int
main ()
{
  unsigned mem_size = 5 * sizeof (char *);
  stack = calloc (1, mem_size + sizeof (char *));   // add 1 extra NULL ptr and clear mem
  p = stack;
  size = mem_size / sizeof (char *);

  for (int i = 0; i < size; i++)
    {
      char s[2];
      sprintf (s, "%d", i);
      char *s1 = strdup (s);    // allocate copy of s to put in stack
      printf ("pushing: %s\n", s1);
      push (s1);
    }
  printf ("printing stack after pushing: \n");
  print_stack (stack);
  for (char *s; s = pop ();)
    {
      printf ("popped: %s\n", s);
      free (s);         // free ptr allocated with strdup
    }
  printf ("printing stack after popping: \n");
  print_stack (stack);

  return 0;
}

产生这个输出:

pushing: 0                                                                                                                                                          
pushing: 1                                                                                                                                                          
pushing: 2                                                                                                                                                          
pushing: 3                                                                                                                                                          
pushing: 4                                                                                                                                                          
printing stack after pushing:                                                                                                                                       
0                                                                                                                                                                   
1                                                                                                                                                                   
2
3
4                                                                                                                                    
popped: 4                                                                                                                                                           
popped: 3                                                                                                                                                           
popped: 2                                                                                                                                                           
popped: 1                                                                                                                                                           
popped: 0                                                                                                                                                           
printing stack after popping:   

【讨论】:

  • 感谢您的回答,它确实有效!但是,考虑到这种方法:``` void print_stack(char **stack_to_print) { char **temp = stack_to_print; while (*temp != NULL) { printf("%s \n", *temp);温度++; } } ``` 使用 push 方法后,我得到了我推送的内容的打印。但是,在调用 pop() 一次或多次之后,打印方法仍然打印相同的值,因为没有任何东西从堆栈中弹出。是打印的方法不对还是部分代码看不懂?
  • 更新了答案以添加您的 print_stack 函数。您编写 print_stack 的方式假设堆栈项用 NULL 清零,并且您至少有 1 个 NULL,因此我在初始堆栈分配中添加了一个额外的。还更新了 pop 以将堆栈中的元素清零并返回指针的副本。代码也在这里:onlinegdb.com/rkAgx7NQw
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 2013-07-20
相关资源
最近更新 更多