堆栈 - 弹出功能打印零,我没有推

时间:2013-12-30 07:46:08

标签: c data-structures null stack pop

我做了一个使用结构创建堆栈的任务。 我的问题是当我在pop中定义一个变量(num)时,每当我弹出它时,会显示一个额外的0。 因此,不是打印num i打印st.stk [st.top],而是工作。

我想知道为什么当删除注释标记并且我打印num而不是st.stk [st.top]时,我将0作为输出

#include<stdio.h>
#include<stdio.h>
#define SIZE 4

struct stack{
    int stk[SIZE];
    int top;
} st;

main()
{
    st.top=-1;
    int option,ans;
    printf("\nStack implementation in C");

    do {
        printf("\nChoose what you want to do \n1.Push\n2.Pop\n3.Display\n4.Exit");
        scanf("%d",&option);

        switch(option)
        {
            case 1:
                push();
                break;

            case 2:
                pop();
                break;

            /*case 3:
                display();
                break;

            case 4:
                exit(1);
                break;*/
            default:
                printf("wrong choice");
                break;
        }

  } while(ans != 4);

    getch();
}

void push()
{
    int num;

    if(st.top==SIZE-1)  //if top== 3     0.1.2.3 } 4 digits
    {
        printf("\nStack overflaow");
        return; //exit from function if stack is overflowed
    }

    printf("\nPlease enter neumber you want to enter");
    scanf("%d",&num);

    st.stk[st.top]=num;
    st.top++;
}

void pop()
{
    //int num; 

    if(st.top==-1) //back to initial position
    {
        printf("\nStack underflow");
        return;
    }

    //num=st.stk[st.top];
    st.top--;
    printf("\nItem popped is %d", st.stk[st.top]);M
}

感谢您的回答,这是我的第一个问题,当然我在发布前搜索过但无法找到任何答案:(

**如果需要,我可以发布整个代码

3 个答案:

答案 0 :(得分:0)

您的push()pop()函数中有几个可能导致令您头疼的错误。要解决这些问题,您只需修改操作顺序即可。

要修复pop()功能,请尝试以下操作:

void pop()
{
    int num; 

    if(st.top==-1) //back to initial position
    {
       printf("\nStack underflow");
       return;
    }

    num = st.stk[st.top];
    st.top--;

    // At this point st.stk[st.top] is no longer the stacked element (since we changed st.top).
    printf("\nItem popped is %d", num); // Use the value you red before you changed the stack.
}

要修复push()功能,请尝试以下操作:

void push()
{
    int num;

    if(st.top == SIZE - 1)  //if top== 3     0.1.2.3 } 4 digits
    {
        printf("\nStack overflaow");
        return; //exit from function if stack is overflowed
    }

    printf("\nPlease enter neumber you want to enter");
    scanf("%d",&num);

    // Here st.top refers to the index of the last element that was pushed on the stack or -1 when the stack is empty. 
    // We must first increment it and then assign the value.
    st.top++;
    st.stk[st.top]=num;
}

将来尝试查找逐个错误时,有必要在纸上或脑中尝试在空堆栈上尝试pop()push()函数,在一个完整的堆栈和一个半满/半空堆栈上。

答案 1 :(得分:0)

可能是你的top指向插入的最后一个元素旁边的位置,并且你试图评估num = st.stk [st.top],而不减少顶部指针。因此,你将num作为零。

答案 2 :(得分:0)

您的st.top指向要推送新元素的位置。并且在没有递减的情况下,您计算num。所以它会打印一个额外的数字。