C堆栈功能弹出不起作用为什么?

时间:2011-04-11 08:33:09

标签: c stack pop

#include <stdio.h>
void push(int);
int pop(void);
void display(void);

int main()
{
    int choice=0,val=0;
    do
    {
        printf("\n\t1.Push 2.Pop 3.Display 4.Exit\n\tSelect Your Choice : ");
        scanf("%d",&choice);
        switch(choice)
        {
        case 1:
            printf("\tElement to be Pushed : ");
            scanf("%d",&val);
            push(val);
            break;

        case 2:
            val=pop();
            if(val!=-1)
                printf("\tPopped Element : %d\n",val);
            break;

        case 3:
            display();
            break;

        case 4:
            break;

        default:
            printf("\tWrong Choice");
            break;
        }

    } while (choice!=4);
    return 0;
}

#define maxsize 100
int stack[maxsize];
int stacktop=0;

void push(int val)
{
    if(stacktop<maxsize)
        stack[stacktop++]=val;
    else
        printf("Stack Overflow");
}

int pop()
{
    int a;
    if(stacktop>0)
    {
        a=stack[stacktop];
        return a;
    }
    else
    {
        printf("Stack is Empty");
        return -1;
    }
}

void display()
{
    int i=0;
    if(stacktop>0)
    {
        printf("\tElements are:");
        while(i<stacktop)
        {
            printf("\t%d",stack[i++]);
        }
        printf("\n");
    }
    else
        printf("\tStack is Empty\n");
}

每次我使用pop函数时,总是说pop值为0

2 个答案:

答案 0 :(得分:5)

您调用pop的方法不是修改堆栈;它只是返回它的顶级元素。这不是“流行”通常意味着什么。

答案 1 :(得分:1)

除了Gareth's answer之外,还有一个问题。当你把东西推到堆栈上时,你说的是

stack[stacktop++]=val;

这意味着stacktop始终指向第一个空元素(即:始终位于堆栈顶部元素的正上方),这意味着您的pop()将始终返回垃圾。即使你不打算删除顶部元素(你应该这样做;那就是“弹出”意味着什么),你需要返回堆栈指针正下方的元素。

pop()功能中,您返回stack[stacktop]。如果你改为返回stack[--stacktop],那么堆栈指针将被适当调整(在它用于检索值之前,你将返回有效元素)。