Реализация стека с массивом - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь реализовать стек с массивом в 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 голосов
/ 16 ноября 2018

Привет, ваша реализация стека неверна. Используя gdb, вы можете проверить это . Вы передаете структуру в качестве значения, которое вы должны передать как адрес .

На GDB выможно увидеть

в главном gdb) p & stack1 $ 4 = (stack *) 0x7fffffffddf0

в толчке fn

(gdb) p & st $ 3 = (stack *) 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...