Структура данных стека в связанном списке

Здесь у меня есть код C++ для реализации стека push() и pop() с использованием связанного списка. Я delete/pop() одни данные и все работает нормально, но я хочу pop()/ delete много элементов данных. Предположим, что данные 6 5 4 3 2 1, и я хочу удалить 6 5 4 3, что я могу сделать для этого?

#include <iostream>
using namespace std;

//Structure of the Node
struct Node
{
    int data;
    Node *next;
};
    
// top pointer to keep track of the top of the stack
Node *top = NULL;

//Function to check if stack is empty or not
bool isempty()
{
    if (top == NULL){
        return true;
    } else {
    }
    return false;
}

void pushStack(int value){
    Node *ptr = new Node();
    ptr->data = value;
    ptr->next = top;
    top = ptr;      
}
        
//Function to delete an element from the stack
void pop ( )
{
    if ( isempty() )
        cout << "Stack is Empty";
    else
    {
        Node *ptr = top;
        top = top->next;
        delete(ptr);
    }
}
    
// Function to Display the stack
void displayStack()
{
    if ( isempty() )
        cout << "Stack is Empty";
    else
    {
        Node *temp = top;
        while (temp != NULL)
        {
            cout << temp->data << " ";
            temp = temp->next;
        }
        cout << "\n";
    }
}

int main()
{
    pushStack(1);
    pushStack(2);
    pushStack(3);
    pushStack(4);
    pushStack(5);
    pushStack(6);
      
    pop();
    displayStack();
    
    return 0;
}

⟼Помните, что всегда важно, особенно когда вы изучаете и задаете вопросы о Stack Overflow, поддерживать как можно более организованный код. Постоянный отступ помогает передать структуру и, что важно, намерение, что помогает нам быстро перейти к корню проблемы, не тратя много времени на попытки расшифровать, что происходит.

tadman 25.01.2023 21:34

@Remy Lebeau, почему я должен вызывать pop() четыре раза?

willy 25.01.2023 21:40

@willy Потому что это то, о чем вы просили: «Я хочу удалить 6 5 4 3». Это последние 4 числа, помещенные в стек, поэтому для их удаления требуется 4 вызова pop().

Remy Lebeau 25.01.2023 21:42

Я думал, что у вас есть связанный список, и я был сбит с толку оберткой и ограничением его поведения как стека. Вместо этого вы пишете связанный список и просто предоставляете ему интерфейс стека. Я не знаю, какой подход вы должны использовать, это зависит.

sweenish 25.01.2023 21:44

@Remy Lebeau, а что мне делать, если я хочу удалить элемент между 6 и 3?

willy 25.01.2023 21:44

Теперь комментарии звучат так, как будто OP просто хочет связанный список, а не стек.

sweenish 25.01.2023 21:45

@willy Затем вы просто перебираете список, пока не найдете узел с желаемым значением, delete его из списка и обновите указатель next предыдущего узла, чтобы он указывал на следующий узел в списке. Повторяйте по мере необходимости. Но это не то, как должен работать стек.

Remy Lebeau 25.01.2023 21:45

@sweenish можешь переписать коды?

willy 25.01.2023 21:45

Если бы я это сделал, это было бы совсем не похоже на то, что вы представили. Это связанный список в стиле C. И в зависимости от фактической цели, переписывание может быть не чем иным, как #include <stack>. Но я предполагаю, что это домашнее задание. Так что нет, я не буду писать за тебя домашнюю работу.

sweenish 25.01.2023 21:47

@sweenish как должно быть

willy 25.01.2023 21:49

@sweenish только для обучения и расширения знаний

willy 25.01.2023 21:50

Настоящий класс для одного. Предпочтительно класс-шаблон, поскольку контейнер должен быть контейнером независимо от типа данных, которые он содержит. Класс стека должен действительно просто обертывать какой-то другой более общий контейнер. Если вы проделали тяжелую работу и уже написали связанный список, ваш класс стека будет содержать список в частном порядке, а общедоступный API для класса гарантирует, что связанный список будет вести себя только как стек.

sweenish 25.01.2023 21:51

Тогда я бы предложил найти лучший учебный ресурс, поскольку ваши вопросы до сих пор указывали на то, что вы не знаете, что такое стек, и это проблема, если вы пытаетесь его написать.

sweenish 25.01.2023 21:52

@willy посмотри обновление, которое я только что сделал для своего ответа

Remy Lebeau 25.01.2023 22:01
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Пройдите собеседование по Angular: Общие вопросы и ответы экспертов
Пройдите собеседование по Angular: Общие вопросы и ответы экспертов
Можете ли вы объяснить разницу между ngOnInit и конструктором в Angular?
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
1
14
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть 6 элементов, помещенных в стек, и вы просите удалить последние 4 элемента, которые были помещены в стек. Просто позвоните pop() 4 раза, например:

int main()
{
    pushStack(1);
    pushStack(2);
    pushStack(3);
    pushStack(4);
    pushStack(5);
    pushStack(6);
      
    displayStack(); // displays "6 5 4 3 2 1"

    pop();
    pop();
    pop();
    pop();

    displayStack(); // displays "2 1"
    
    return 0;
}

Онлайн демо


ОБНОВЛЯТЬ:

В комментариях вы спрашиваете, как удалить определенные узлы из середины стека. Хотя это легко сделать с помощью связанного списка, стек не предназначен для такой работы. Стек представляет собой контейнер First-In-Last-Out (FILO), что означает, что первое помещенное значение является последним извлеченным значением. Таким образом, вы должны помещать и извлекать значения только из вершины стека, и больше нигде.

Но если вы действительно хотите это сделать, это будет выглядеть примерно так:

#include <iostream>
using namespace std;

//Structure of the Node
struct Node
{
    int data;
    Node *next;
};
    
// top pointer to keep track of the top of the stack
Node *top = NULL;

//Function to check if stack is empty or not
bool isEmpty()
{
    return (top == NULL);
}

//Function to add an element to the top of the stack
void pushStack(int value){
    Node *ptr = new Node();
    ptr->data = value;
    ptr->next = top;
    top = ptr;      
}
        
//Function to delete the top element from the stack
void pop()
{
    if ( isEmpty() )
        cout << "Stack is Empty\n";
    else
    {
        Node *ptr = top;
        top = top->next;
        delete ptr;
    }
}
    
void removeValue(int value)
{
    if ( isEmpty() )
        cout << "Stack is Empty\n";
    else
    {
        Node *temp = top, **ptr = &top;
        while (temp != NULL)
        {
            if (temp->data == value)
            {
                *ptr = temp->next;
                delete temp;
                return;
            }
            ptr = &(temp->next);
            temp = temp->next;
        }
        cout << "Value not found\n";
    }
}

// Function to display the stack
void displayStack()
{
    if ( isEmpty() )
        cout << "Stack is Empty\n";
    else
    {
        Node *temp = top;
        while (temp != NULL)
        {
            cout << temp->data << " ";
            temp = temp->next;
        }
        cout << "\n";
    }
}

int main()
{
    pushStack(1);
    pushStack(2);
    pushStack(3);
    pushStack(4);
    pushStack(5);
    pushStack(6);
      
    displayStack(); // displays "6 5 4 3 2 1"

    removeValue(4);
    removeValue(5);

    displayStack(); // displays "6 3 2 1"
    
    return 0;
}

Онлайн демо

Позвольте мне погрузиться в

willy 25.01.2023 22:11

Другие вопросы по теме