【问题标题】:C stack using array使用数组的 C 堆栈
【发布时间】:2014-12-29 11:58:01
【问题描述】:

这只是程序的一部分但我不明白这些代码为什么我们在结构中声明 int* 数组是什么意思? 另外我们通常在函数类型之前使用 int 或 void 为什么我们在创建函数之前编写 struct Stack * 以及这里 unsigned 的用途是什么?点击链接查看实际程序。 a link

struct Stack {
    int top;
    unsigned capacity;
    int* array;
};

struct Stack* createStack(unsigned capacity) {
    struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack));
    stack->capacity = capacity;
    stack->top = -1;
    stack->array = (int*) malloc(stack->capacity * sizeof(int));
    return stack;
}

int main() {
    struct Stack* stack = createStack(100);
}

【问题讨论】:

  • 不要被冒犯,但您需要有关于c 数据类型的基础课程。有很多基本的概念问题。
  • int * 不是数组,而是指针。
  • 无符号表示无符号整数。
  • @iharob 在链表中,我们使用 next 指针指向下一个元素,但由于数组具有传染性,所以我们不需要指针,为什么在这里使用指针?
  • @SouravGhosh 你能推荐一些课程吗

标签: c singly-linked-list


【解决方案1】:

1) 使用 int * 是因为我们事先不知道数组会有多大,所以我们将其声明为指针并使用堆栈的容量进行 malloc。

如果我们使用了一个数组,我们必须执行额外的检查以查看我们最初声明的大小是否溢出,这将是整个程序的巨大开销。

2) 函数create stack返回栈类型的结构指针,根据函数的语法。

语法:

<return type> function_name(<Parameters>){<Statements>}

3) 如果有人试图声明负容量,我们希望程序给我们一个错误。无符号确保满足这一点

希望这会有所帮助。

【讨论】:

  • 所以,基本上创建堆栈用于创建一个足够大的结构以容纳 100 个数组元素。在链表中,我们创建单独的节点,即,单独的结构,但具有相同类型以容纳超过 1 个元素但是这里我们是只创建一个结构还是为每个 100 个元素创建一个相同类型的单独结构?
  • 1 个结构。分配了 100 个 int 元素。但在 yoru 链接中只使用了 3 个。
  • 你的意思是只使用了 3 个我们已经创建了一个包含 100 个元素的堆栈 [create stack(100)]
  • 查看链接中的示例。他正在创建一个可以容纳 100 个整数的堆栈,但对于演示,他正在推动 10、20、30(使用 3 个整数空格)。然后弹出 30(从堆栈中删除一个)。然后显示栈顶(移除 30 TOS 后为 20)
【解决方案2】:

为什么我们在结构体中声明int*数组是什么意思?

array 成员用于存储堆栈的内容。但是,我们无法提前知道堆栈需要容纳多少元素,因此我们不能将其声明为常规数组(其大小必须在编译时知道1)。相反,我们将在运行时使用malloc 库函数分配内存,该函数返回指向动态分配块的第一个元素的指针;这个指针将被存储到数组成员中。

为什么我们要在创建函数之前写 struct Stack *

因为createStack 函数返回一个指向新struct Stack 实例的指针:

struct Stack *createStack( ... )  ----------------+
{                                                 | The type of the expression in the 
  struct Stack *stack = ...; -----+               | `return` statement must match the  
  ...                             |               | return type of the function
  return stack; <-----------------+---------------+
}

这里的无符号有什么用

unsignedunsigned int 的缩写;它保证只有非负值可以用于堆栈大小。

这是调用createStack 函数后的内存样子:

                   +---+
            stack: |   |----+  // The stack variable points to a struct Stack instance
                   +---+    |
                    ...     |
                   +---+    |
       stack->top: |   |<---+  // The actual struct Stack instance is created on the heap
                   +---+       // The -> operator allows us to refer to the members of the
  stack->capacity: |   |       // instance through the stack pointer variable.
                   +---+       
     stack->array: |   |----+  // The memory for the stack contents is allocated in a 
                   +---+    |  // separate malloc call, and the resulting pointer is
                    ...     |  // stored in the instance's array member.  
                   +---+    |
  stack->array[0]: |   |<---+
                   +---+
  stack->array[1]: |   |
                   +---+
  stack->array[2]: |   |
                   +---+
                    ...
                   +---+
stack->array[N-1]: |   |    // N == stack->capacity
                   +---+

main 中的stack 变量指向struct Stack 的一个实例;这个实例是由行创建的

struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack));

createStack 函数中。堆栈实例的内存取自“堆”(为动态分配保留的内存区域)。在堆栈实例中,array 成员还指向另一个调用 malloc 保留的动态内存区域:

stack->array = (int*) malloc(stack->capacity * sizeof(int));

此函数留出足够的内存来存储int 成员中指定的int 对象。

编辑

请注意,两个malloc 调用都可以按如下方式清理:

struct Stack *stack = malloc( sizeof *stack );
...
stack->array = malloc( stack->capacity * sizeof *stack->array );

除非您使用的是 C++ 编译器或早于 1989 年标准的 C 编译器,否则强制转换是不必要的(并且在 C89 实现上是危险的)。

sizeof 表达式使用取消引用的目标表达式,而不是类型名称;这会清理一些视觉上的混乱,如果您决定更改目标变量的类型(例如,从int *double *),它会减少维护。表达式*stack 的类型是struct Stack,所以它遵循sizeof *stack == sizeof (struct Stack)。同样,表达式*stack-&gt;array 的类型是int,所以sizeof *stack-&gt;array == sizeof (int)。请注意,仅当 sizeof 的操作数是类型名称时才需要括号。


1。 C99 引入了可变长度数组,其大小可以在运行时指定,但由于多种原因,它们在这种情况下不起作用。

【讨论】:

  • 非常感谢详细解释.. 堆栈变量主要指向结构堆栈的一个实例,这类似于说堆栈变量是结构堆栈的一个对象,它具有所有的副本结构栈的成员?通过使用结构而不是使用数组的简单堆栈来实现这一点,我们可以获得什么额外的优势?同样在最后一行中你说如果它从 int 变为 double 所以最好用第二种方式编写,但第一种方式不是更简单,只需将 (int) 更改为 (double) 吗?
猜你喜欢
  • 2019-02-02
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2020-03-20
  • 2010-11-26
  • 2020-06-12
  • 2012-11-18
  • 2020-04-09
相关资源
最近更新 更多