Как исправить функцию удаления элемента из стека? - PullRequest
2 голосов
/ 03 июня 2019

Я пытаюсь создать функцию, которая получит некоторый стек с целыми числами и «n» (число для удаления). Функция проверит стек и удалит элемент, если найдет его. Стек должен оставаться в том же порядке после удаления элемента «n». Я пытаюсь скопировать все элементы во временный стек, а когда нахожу элемент, не копировать его. После этого я хочу вернуть все элементы в первый стек. Что-то не так в моей функции. Я строю свою функцию вокруг некоторого кода, который я нашел в сети.

#include<stdio.h>
#define MAX 3
typedef int item;

typedef struct
{
    int TOP;
    int ele[MAX];
}Stack;

void init(Stack* s)
{
    s->TOP = -1;
}

int isFull(Stack* s)
{
    if (s->TOP == MAX - 1)
        return 0;
    return -1;
}

int isEmpty(Stack* s)
{
    if (s->TOP == -1)
        return 0;
    return -1;
}

void push(Stack* s, int item)
{
    if (!isFull(s))
    {
        printf("\nStack is full");
        return;
    }
    s->TOP = s->TOP + 1;
    s->ele[s->TOP] = item;
}

int pop(Stack* s, int* item)
{
    if (!isEmpty(s))
    {
        printf("\nStack is empty");
        return -1;
    }
    *item = s->ele[s->TOP];
    s->TOP = s->TOP - 1;

    return 0;
}

void func(Stack* s, item num)
{
    //Check stack
    if (s->TOP == -1)
    {
        printf_s("is empty");
        return 0;
    }       

    Stack temp;      //def temporary stack
    init(&temp);     //init temporary stack
    item current=0;

    while (s->TOP != -1)
    {       
        pop(&s, &current);
        if (current != num)
        {
            push(&temp, current);
        }           
    }

    while (!isEmpty(&temp))
    {
         pop(&temp, &current);
         push(&s, current);
    }

    while (s->TOP != -1)
    {
        pop(&s, &current);
        {
            printf_s("\nPoped Item : %d", current);
        }   
    }
}

int main()
{
    Stack s;
    item num = 20;

    init(&s);

    push(&s, 4);
    push(&s, 20);
    push(&s, 11);

    func(&s, num);    //delete specific element in stack

    getch();

    return 0;
}

Я пытался исправить все моменты, но появляются все те же предупреждения ... и код не работает. == >>> Новая версия:

#include<stdio.h>
#define MAX 3
typedef int item;

typedef struct
{
    int top;
    int ele[MAX];
}Stack;

void init(Stack* s)
{
    s->top = -1;
}

int isFull(Stack* s)
{
    return s->top == MAX - 1;
}

int isEmpty(Stack* s)
{
    return s->top != -1;
}

void push(Stack* s, int item)
{
    if (isFull(s))
    {
        printf("\nStack is full");
        return;
    }
    ++s->top;         //can be written as: s->TOP = s->TOP + 1;
    s->ele[s->top] = item;
}

int pop(Stack* s, int* item)
{
    if (!isEmpty(s))
    {
        printf("\nStack is empty");
        return -1;
    }
    *item = s->ele[s->top];
    --s->top;        //can be written as: s->top = s->top - 1;

    return 0;
}

void func(Stack* s, item num)
{
    //Check stack
    if (s->top == -1)
    {
        printf_s("is empty");
        return;
    }

    Stack temp;      //def temporary stack
    init(&temp);     //init temporary stack
    item current = 0;

    while (s->top != -1)
    {
        pop(s, &current);
        if (current != num)
        {
            push(&temp, current);
        }
    }

    while (!isEmpty(&temp))
    {
        pop(&temp, &current);
        push(s, current);
    }

    while (s->top != -1)
    {
        pop(&s, &current);
        {
            printf_s("\nPoped Item : %d", current);
        }
    }
}

int main()
{
    Stack s;
    item num = 20;

    init(&s);

    push(&s, 4);
    push(&s, 20);
    push(&s, 11);

    func(&s, num);    //delete specific element in stack

    getch();

    return 0;
}

enter image description here

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

В

    pop(&s, &current);

s уже указатель. Он определяется как Stack * s. Следовательно, &s является Stack **, тогда как pop ожидает Stack * в качестве первого параметра. Просто удалите & здесь.

0 голосов
/ 06 июня 2019

Спасибо всем пользователям, которые помогают мне советами и подсказками! Вот окончательный вариант после всех исправлений. Наконец-то это работает!

#include<stdio.h>
#define MAX 7
typedef int item;

typedef struct
{
    int top;
    int ele[MAX];
}Stack;

void init(Stack* s)
{
    s->top = -1;
}

int isFull(Stack* s)
{
    return s->top == MAX - 1;
}

int isEmpty(Stack* s)
{
    return s->top == -1;
}

void push(Stack* s, int item)
{
    if (isFull(s))
    {
        printf("\nStack is full");
        return;
    }
    ++s->top;         //can be written as: s->TOP = s->TOP + 1;
    s->ele[s->top] = item;
}

int pop(Stack* s, int* item)
{
    if (isEmpty(s) == 1)
    {
        printf("\nStack is empty");
        return -1;
    }
    *item = s->ele[s->top];
    --s->top;        //can be written as: s->top = s->top - 1;

    return 0;
}

void func(Stack* s, item num)
{
    //Check stack
    if (isEmpty(s) == 1)
    {
        printf_s("is empty");
        return;
    }

    Stack temp;      //def temporary stack
    init(&temp);     //init temporary stack
    item current;

    printf_s("\n\nCopy all items from s stack to temp stack");
    while (isEmpty(s) != 1)
    {
        pop(s, &current);
        if (current != num)
        {
            push(&temp, current);
            printf_s("\nPushed Item is: %d", current);
        }
        else
            printf_s("\nDeleted Item is: %d", current);
    }

    printf_s("\n\n\nCopy all items from temp stack to s stack");

    while (isEmpty(&temp) != 1)
    {
        pop(&temp, &current);
        printf_s("\nPoped Item is: %d", current);
        push(s, current);
    }

    printf_s("\n\n\nPosition of elements in s stack");

    while (isEmpty(s) != 1)
    {
        pop(s, &current);
        printf_s("\nPoped Item is: %d", current);
    }
}

int main()
{
    Stack s;
    item stackElem;
    item num = 20;

    init(&s);

    printf("Fill stack \'s\'\n"); 
    while (!isFull(&s))
    {
        printf_s("Enter integer number please: ");
        scanf_s("%d", &stackElem);
        push(&s, stackElem);
        printf_s("Pushed Item is: %d\n", stackElem);
    }

    func(&s, num);    //delete specific element in stack

    getch();

    return 0;
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...