Stack不会在C中存储价值

时间:2017-11-25 20:21:19

标签: c stack

我目前正在尝试创建一个简单的Stack菜单程序,该程序将推送和弹出用户输入的值。 (并打印出堆栈。)

这是我到目前为止的代码。当我尝试插入一个值(案例1)时,我认为它有效 - 但我不确定,因为当我尝试打印出堆栈(案例3)时,它总是说"堆栈是空的!&# 34 ;.当我尝试弹出堆栈(案例2)时,它就会崩溃。

我不知道我的某个结构是否已关闭,或者我的指针是否正确。

提前感谢您的帮助,对于凌乱的代码我感到非常抱歉 - 我还是很陌生!

#include<stdio.h> 
#include<stdlib.h>
#define EMPTY 0

struct node
{
    int data;
    struct node *link;
};
typedef struct node Stack;

Stack* get_node()
{
    Stack *tmp;
    tmp = (Stack*) malloc(sizeof(Stack));
    tmp->link = EMPTY;
    return tmp;
}

void push(Stack **top, int data)
{
    Stack *tmp;
    tmp = *top;

    *top = get_node();

    (*top)->data = data;
    (*top)->link = tmp;
}

void pop(Stack **top)
{
    Stack *tmp;
    int num;
    if (top == EMPTY)
    {
        printf("Stack is Empty!");
    }
    else
    {
        tmp = *top;
        printf("%d", tmp->data);
        *top = tmp->link;
        free(tmp);
    }
}

void stack(Stack *top)
{
    if (top == EMPTY)
    {
        printf("Stack is Empty...");
    }
    else
    {
        Stack *tmp = top;
        while (tmp->link != EMPTY)
        {
            printf("%d", tmp->data);
            tmp = tmp->link;
        }
    }
}

void menu(int choice)
{
    Stack *top = EMPTY;
    int data;

    switch (choice)
    {
        case 1:
            printf("Enter Data : ");
            scanf_s("%d", &data);
            push(&top, data);
            break;

        case 2:
            pop(&top);
            break;

        case 3:
            stack(top);
            break;

        case 4:
            exit(1);
    }
}

void main()
{
    int choice;

    printf("< < = M e n u = = >\n");
    printf("1.push\n");
    printf("2.pop\n");
    printf("3.print_all\n");
    printf("4.quit\n");
    printf("Select : ");
    while (1)
    {
        scanf_s("%d", &choice);
        menu(choice);
    }
}

2 个答案:

答案 0 :(得分:0)

您实际上并没有将堆栈保留在任何位置。每次在菜单中输入选项时,menu函数都会以空Stack开头。当您插入,然后打印Stack时,每次都会有一个空的Stack

void menu(int choice)
{
    Stack *top = EMPTY; // Problem -  Always empty Stack for each call
    int data;
    ...
}

要解决此问题,您需要拥有全局变量Stack或将Stack传递给每个函数以供使用。

答案 1 :(得分:0)

top函数中执行一些小的更改,例如将pointer static作为menu(),因为如果您不将其设为static,则会每次使用zero初始化。 替换此

Stack *top = EMPTY;

  static Stack *top ;

并修改stack()功能,您打印的元素少了

void stack(Stack *top)
{
    if (top == EMPTY)
    {
        printf("Stack is Empty...");
    }
    else
    {
        Stack *tmp = top;
        while (tmp != EMPTY) // here you wrote as tmp->link
        {
            printf("%d \n ", tmp->data);
            tmp = tmp->link;
        }
    }
}

剩下的所有逻辑都是正确的。我希望它有所帮助。