0

我正在尝试使用单链表在 C 中实现一个堆栈,只要堆栈不为空,它就可以正常工作。一旦清空,我的 pop 方法永远不会检测到它是空的,但会给出一些随机值。有什么办法可以让我知道堆栈是空的吗?这是我正在使用的 pop 方法以及示例主程序输出。

int main(int argc, char const *argv[])
{
    Node* top;
    push(&top,5);
    printf("Popped Element: %d\n",pop(&top));
    printf("Popped Element: %d\n",pop(&top));

    return 0;
}

int pop(Node** top)
{
    if(*top == NULL)
    {
        printf("Error: Stack is empty!\n");
        return;
    }
    int temp = (*top)->iData;
    *top = (*top)->next;
    return temp;
}

输出:

Popped Element: 5
Popped Element: 1707388

编辑:这是推送的代码

void push(Node** top ,int num)
{
    Node* temp = (Node* )malloc(sizeof(Node));
    temp->iData = num;
    temp->next = *top;
    *top = temp;
}
4

7 回答 7

0

pop的函数需要返回一个整数。所以这段代码

if(*top == NULL)
    {
        printf("Error: Stack is empty!\n");
        return;
    }

需要修改。

要么获取pop一个指向将具有该值的整数的指针,pop如果是这种情况,该函数将返回 true - 或者有一个不应该在堆栈上的有,例如 -1。

所以请return阅读return(-1);

或者

int pop(Node** top, int *value)
{
    if(*top == NULL)
    {
        printf("Error: Stack is empty!\n");
        return 0;
    }
    *value = (*top)->iData;
    *top = (*top)->next;
    return 1;
}

编辑

更改Node *top = NULL以下代码后push

void push(Node **top, int value)
{
    Node *newTop = malloc(sizeof(Node));
    newTop->next = *top;
    *top = newTop;
    newTop->iData = value;
}
于 2012-09-21T09:59:32.480 回答
0

在 Node 的 Ctor 中在 NULL 旁边初始化。如果堆栈为空,则返回一个值(例如 -1)

编辑:

如果你没有一个Ctor。(你使用malloc)然后你必须将栈上第一个节点的next字段初始化为NULL

于 2012-09-21T10:00:21.503 回答
0

我认为问题来自你的节点声明,如果你声明一个 Node*,你必须在使用它之前分配它。也许可以测试一下(我在这台计算机上没有任何编译器,所以我无法自己测试)

    int main(int argc, char const *argv[])
{
    Node* top;
    top = malloc(sizeof(*top));
    push(&top,5);
    printf("Popped Element: %d\n",pop(&top));
    printf("Popped Element: %d\n",pop(&top));

    return 0;
}

int pop(Node** top)
{
    if(*top == NULL)
    {
        printf("Error: Stack is empty!\n");
        return;
    }
    int temp = (*top)->iData;
    *top = (*top)->next;
    return temp;
}

我希望这可以解决您的问题。

于 2012-09-21T10:02:30.943 回答
0

定义一个全局或静态变量来记住您对堆栈的使用。每次你在堆栈中压入一些东西时,用 SizeOf(...) 调整你的计数器的值,反之则为 pop。

于 2012-09-21T10:02:46.707 回答
0

在创建节点时,即在 push() 中,如果 first(Head) 元素的下一个应该为 NULL。

在你的情况下,(*top)->next不是 NULL。

所以

printf("Error: Stack is empty!\n");
return;

未执行。

对于编辑:

void push(Node** top ,int num)
{

    Node* temp = (Node* )malloc(sizeof(Node));

     if(*top == NULL)
     {
         temp->next = NULL;
     }
     else
     {
         temp->next = *top;
     }
    temp->iData = num;    
    *top = temp;
}

更新代码

#include <stdlib.h>

typedef struct
{
int iData;
struct Node *next;
}Node;

int pop(Node** top)
{
    if(*top == NULL)
    {
        printf("Error: Stack is empty!\n");
        return 0;
    }

    Node *tmp = *top;
    int temp = tmp->iData;
    *top = tmp->next;
    free(tmp);
    return temp;
}

void push(Node** top ,int num)
{

    Node* temp = (Node* )malloc(sizeof(Node));

     if(*top == NULL)
     {
         temp->next = NULL;
     }
     else
     {
         temp->next = *top;
     }
    temp->iData = num;
    *top = temp;
}

int main(int argc, char const *argv[])
{
    Node* top;
    push(&top,5);
    printf("Popped Element: %d\n",pop(&top));
    printf("Popped Element: %d\n",pop(&top));

    return 0;
}

这将打印

Popped Element: 5
Error: Stack is empty!
Popped Element: 0

其次Popped Element: 0是因为调用 pop() 两次。反正 Stack Empty 被检测到。

于 2012-09-21T10:04:14.990 回答
0

您可能只返回节点而不是整数,如果节点是NULL,则列表为空,否则您可能会获得节点数据:

Node *pop (Node **top)
{
    Node *ret = NULL;

    if (*top != NULL)
    {
        ret = *top;
        *top = (*top)->next;
    }

    return ret;
}
于 2012-09-21T10:04:28.900 回答
0

在创建新节点并将新节点添加到列表时,在 NULL 旁边进行初始化。并使用

return -1;

代替

return;

编辑:

在 main 中初始化 *top =NULL

   int main(int argc, char const *argv[])
{
    Node* top=NULL;
    push(&top,5);
    printf("Popped Element: %d\n",pop(&top));
    printf("Popped Element: %d\n",pop(&top));

    return 0;
}
于 2012-09-21T10:10:41.190 回答