【问题标题】:C Stack Implementation [duplicate]C堆栈实现[重复]
【发布时间】:2014-02-16 03:30:48
【问题描述】:

我在 C 中实现 Stack ADT。Stack 遵循数组实现,其中数组是 void * 的数组。以下行为让我感到困惑,任何人都可以提供一些见解吗? i 的地址&i 总是相同的,因此我通过弹出它获得的值应该相同,但事实并非如此。此外,数字是相反的顺序。我错过了什么?

#include <stdio.h>
#include "stack.h"

int main(int argc, char const *argv[])
{
    Stack* s = Stack_Create(10);
    int i;
    for (i = 0; i < 10; i++){
        Stack_Push(s, &i);
    }
    for (i = 0; i < 10; i++){
        printf("%d\n", *((int *)Stack_Pop(s)));
    }
    Stack_Destroy(s);
    return 0;
}

打印:

0
1
2
3
4
5
6
7
8
9

堆栈实现:

#include "stack.h"

struct Stack
{
    size_t size;
    size_t top;
    void** e;
};

Stack* Stack_Create(size_t n)
{
    Stack* s = (Stack *)malloc(sizeof(Stack));
    s->size = n;
    s->top = 0;
    s->e = (void**)malloc(sizeof(void*) * (n + 1));
    return s;
}

int Stack_Empty(Stack* s)
{
    if (s->top == 0)
    {
        return 1;
    } else {
        return 0;
    }
}

void Stack_Push(Stack* s, void* e)
{
    if (s == NULL) return;
    if (s->top == s->size) return;
    s->top = s->top + 1;
    s->e[s->top] = e;
}

void* Stack_Pop(Stack* s)
{
    if (Stack_Empty(s)) return NULL;
    s->top = s->top - 1;
    return s->e[s->top+1];
}

void Stack_Destroy(Stack* s)
{
    if (s == NULL) return;
    free(s->e);
    free(s);
}

头文件:

#include <stdlib.h>
#ifndef __STACK_H__
#define __STACK_H__
struct Stack;
typedef struct Stack Stack;

Stack* Stack_Create(size_t n);
void Stack_Destroy(Stack* s);
void Stack_Push(Stack* s, void* e);
void* Stack_Pop(Stack* s);
int Stack_Empty(Stack* s);
#endif

【问题讨论】:

  • 为什么这被否决了?
  • 您正在使用的变量的地址或您的循环迭代将在整个堆栈中复制。您只能将一个地址压入堆栈,即&amp;i。因此,取消引用您弹出的 anything 将导致取消引用 &amp;i,这恰好也是您正在使用的循环控制变量。 IE。你的循环正在修改i,因为i的地址是堆栈上唯一的东西(重复),你的打印只不过是printf("%d\n, i);这样做:在你的堆栈推送中放一个printf(%p\n", e);运行并观察会发生什么。
  • 谢谢,现在使用j作为索引时答案是一致的。
  • 使用j作为第二个循环的索引,这应该每次打印10(i的值)。
  • 居然设法找到了关于这个的上一个问题:Odd problem with pointer while implementing a linked list

标签: c pointers data-structures stack


【解决方案1】:

我通过弹出它获得的值应该是相同的,但它不是

是的。

数字倒序

不,他们不是。您在第二个循环中打印i 的连续值,范围从0 到9。注意*

*((int *)Stack_Pop(s))

*&amp;i 就是i

【讨论】:

    猜你喜欢
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2013-08-13
    相关资源
    最近更新 更多