C堆栈实现

时间:2014-02-16 03:30:49

标签: c pointers data-structures stack

我正在C中实现堆栈ADT。堆栈遵循数组实现,其中数组是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

1 个答案:

答案 0 :(得分:1)

  

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

是的。

  

数字的顺序相反

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

*((int *)Stack_Pop(s))

*&i只是i