Реализация стека с использованием связанного списка и шаблонов классов - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь реализовать стек, используя связанный список и шаблон класса. Я не получаю никаких ошибок компилятора, но мой лог c может быть неправильным, вроде потерянным. У меня была рабочая программа в одном файле, использующая только структуру, поэтому у меня возникли трудности с ее переводом с использованием нескольких файлов и шаблонных классов. Я также включу свой единственный файл cpp ниже, надеюсь, это поможет. Любая помощь будет оценена. У меня есть файл header.h, функции. cpp и основной. cpp.

Header.h

#define STACK_H
#include <iostream>

using namespace std;

//to implement a stack using linked list
template<class T>
class node{ 
  public:
  T data;
  node<T>*next;
};

template<class T>
class stack{
  private:
  node<T> *item;
  node<T> *top;
  public:
  stack(); // constructor
  void push( node<T> *); // to insert an item to the stack
  void pop(); // to remove an item from the stack
  void display(); // to display the stack elements on screen
  node<T> *newnode(int );
};

#include "functions.cpp"
  #endif

функций. cpp

#include <iostream>
#include "header.h"

#ifndef FUNCTIONS
#define FUNCTIONS

using namespace std;


template<class T>
stack <T> :: stack(){

node<T> *top = NULL;

}

template<class T>
void stack <T> :: push(node<T> * q){
if (top == NULL)
        top = q;
    else
    {
        q->next = top;
        top = q;

    }
}

template<class T>
void stack <T> :: pop(){
if (top == NULL) {
        cout << "Stack is empty";
    }
    else {
        cout << "Popped element is " << top->data;
        item = top;
        top = top->next;
        delete(item);
    }
}

template<class T>
void stack <T> :: display(){
node<T> *q;
    q = top;

    if (top == NULL) {
        cout << "Stack is empty!!";
    }
    else {
        while (q != NULL)
        {
            cout << q->data << " ";
            q = q->next;
        }
    }
}  

template<class T>
node<T> * stack <T> :: newnode(int x)
{

    item = new node<T>;
    item->data = x;
    item->next = NULL;
    return(item);
}

#endif

main. cpp

#include<iostream> 
#include "header.h"

using namespace std;

int main()
{
    int ch, x;

  stack <int> myStack;
    node<int> *nptr;


    do
    {
        cout << "\n\n1.Push\n2.Pop\n3.Print Stack\n4.Exit";
        cout << "\nPlease enter a function(1-4):";
        cin >> ch;

        if (ch == 1)
        {
            cout << "\nEnter data:";
            cin >> x;
            nptr = myStack.newnode(x);
            myStack.push( nptr);
        }

        else if (ch == 2)
        {
            myStack.pop();
        }

        else if (ch == 3)
        {
            myStack.display();
        }
        else cout << "\nInvalid Entry";

    } while (ch != 4);

    return 0;
}

Рабочая программа с одним файлом

struct nodeType
{
    int data;
    nodeType *next;
};

nodeType *top = NULL;
nodeType *p;

nodeType* newnode(int x)
{
    p = new nodeType;
    p->data = x;
    p->next = NULL;
    return(p);
}

void push(nodeType *q)
{
    if (top == NULL)
        top = q;
    else
    {
        q->next = top;
        top = q;
    }
}

void pop() {
    if (top == NULL) {
        cout << "Stack is empty";
    }
    else {
        cout << "Popped element is " << top->data;
        p = top;
        top = top->next;
        delete(p);
    }
}

void printStack()
{
    nodeType *q;
    q = top;

    if (top == NULL) {
        cout << "Stack is empty!!";
    }
    else {
        while (q != NULL)
        {
            cout << q->data << " ";
            q = q->next;
        }
    }
}

int main()
{
    int ch, x;

    nodeType *nptr;


    do
    {
        cout << "\n\n1.Push\n2.Pop\n3.Print Stack\n4.Exit";
        cout << "\nPlease enter a function(1-4):";
        cin >> ch;

        if (ch == 1)
        {
            cout << "\nEnter data:";
            cin >> x;
            nptr = newnode(x);
            push(nptr);
        }

        else if (ch == 2)
        {
            pop();
        }

        else if (ch == 3)
        {
            printStack();
        }
        else cout << "\nInvalid Entry";

    } while (ch != 4);

    return 0;
}
...