数组的堆栈实现

时间:2018-11-16 00:17:50

标签: c data-structures stack

我正在尝试用C实现带有数组的堆栈。但是我想我的push函数不正确。(也许还有其他一些错误)因为当我运行代码时,它会显示“堆栈为空!”两次。

我该如何解决这个问题,这种实现逻辑是真的吗?

#include <stdio.h>

#define SIZE 10

 typedef struct stack
 {
     int top;
     int items[SIZE];
 }stack;

 void push(int a, stack st)
 {
     if((st.top + 1) != SIZE)
     {
         st.top++;
         st.items[st.top] = a;
     }
     else
     {
         printf("\nStack is full!");
     }
 }

 void pop(stack st)
 {
     if(st.top != -1)
     {
         st.top--;
     }
     else
     {
         printf("\nStack is empty!");
     }
 }

 void printList(stack st)
 {
     int i;
     for(i = 0; i < st.top + 1; i++)
     {
         printf("%d -> ", st.items[i]);
     }
     puts("");
 }

 int main(void)
 {
     stack stack1;
     stack1.top = -1;

     stack stack2;
     stack2.top = -1;

     push(3, stack1);
     push(5, stack1);
     push(7, stack1);

     printList(stack1);

     pop(stack1);
     printList(stack1);

     pop(stack1);
     printList(stack1);
 }

1 个答案:

答案 0 :(得分:1)

您的堆栈实现错误。使用gdb可以验证这一点。您正在传递结构作为值应作为地址传递

在gdb上您可以看到

在主要 gdb)p&stack1 $ 4 =(堆栈*)0x7fffffffddf0

按fn

(gdb)p&st $ 3 =(堆栈*)0x7fffffffdd90

两者都不同。

下面给出了正确的代码。

#include <stdio.h>

#define SIZE 10

typedef struct stack
{
        int top;
        int items[SIZE];
}stack;

void push(int a, stack *st)
{
        if((st->top + 1) != SIZE)
        {
                st->top++;
                st->items[st->top] = a;
        }
        else
        {
                printf("\nStack is full!");
        }
}

void pop(stack *st)
{
        if(st->top != -1)
        {
                st->top--;
        }
        else
        {
                printf("\nStack is empty!");
        }
}

void printList(stack *st)
{
        int i;
        for(i = 0; i < st->top + 1; i++)
        {
                printf("%d -> ", st->items[i]);
        }
        puts("");
}

int main(void)
{
        stack stack1;
        stack1.top = -1;

        stack stack2;
        stack2.top = -1;

        push(3, &stack1);
        push(5, &stack1);
        push(7, &stack1);

        printList(&stack1);

        pop(&stack1);
        printList(&stack1);

        pop(&stack1);
        printList(&stack1);
}