堆栈的Pop函数具有意外行为

时间:2016-05-12 11:37:25

标签: c linux gcc

我只是代表我的指南和一名学生参加了这个代码的演讲:

#include<stdio.h>

struct stack{
     int top;
     int store[50];
};

void push(int num, struct stack stk)
{
        stk.store[stk.top] = num;
        stk.top = stk.top + 1;
}

int pop(struct stack stk)
{
        int temp = stk.store[stk.top];
        stk.store[stk.top - 1] = 0;
        stk.top = stk.top - 1;
        return temp;
}

int main()
{
        int i;
        struct stack imp, pl;
        imp.top = 0;
        for(i = 0; i<8; i++)
        {
                int choice, val;
                printf("Menu:\n\n");
                printf("1. Push\n");
                printf("2. Pop\n");
                printf("3. Exit\n\n");

                printf("Please enter the choice:");
                scanf("%d", &choice);
                switch(choice)
                {
                        case 1:
                                printf("Please enter the value to be inserted");
                                scanf("%d", &val);
                                push(val, imp);
                                printf("The position:%d\n",imp.top);
                                break;
                        case 2:
                                printf("The poped value is : %d at position:%d\n",pop(imp), imp.top);
                                break;
                        case 3:
                                return 0;
                                break;
                        default:
                                printf("Wrong choice.\n");
                }
        }
}

top的值始终为零,pop返回的值始终为零。 有人可以指出代码的错误或代码行为背后的原因。

2 个答案:

答案 0 :(得分:2)

您的推送操作符假定stk.top 一个条目堆栈的顶部元素。您的pop操作符假定stk.top 是顶层元素。 (排序;它实际上在内部有点不一致。)

我建议您绘制一个图表并手动执行一些操作,逐行执行代码。注意一个一个一个的问题,并在找到它们时修复它们。

[编辑添加:]哦,Sourav Ghosh(在对原始问题的评论中)也提出了一个非常重要的观点:你是通过值而不是指针传递你的堆栈对象,这也是打破一切 - 因为storepop函数中的修改应用于副本,而不是原始版本。我是社区维基这个答案,因为其中一个关键的东西现在来自我以外的人。

答案 1 :(得分:2)

pop函数返回[top]但重置[top - 1]为0。