У меня ошибка в стеке с использованием связанного списка.Невозможно напечатать цикл чисел.(C ++) - PullRequest
1 голос
/ 31 октября 2011

$ У меня следующая ошибка: 44 E: \ Assignment 2.cpp нет совпадения для 'operator <<' в 'std :: cout <(& number) -> newstack :: push (x)'

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

 #include <iostream>
using namespace std;

typedef int itemType;


 class newstack
  {

private:
  Using a struct of nodes which contains a item and pointer to the next node.

  struct node  
  {

        itemType item;
    node *next;
  };

   node *top;  //pointer to the top node.
 public:

  void push(itemType newItem); //adds items to newstack

   };




  int main()

  { 
     newstack number; 
      int x;

      cout<< "Number Stack" <<endl;

     for (x=0;x<=9;x++) 

     cout<<(number).push(x)<<endl;  //ERROR LINE
     //Takes 9 integers and adds them to the stack by printing them out.
     return 0;

   }


  void newstack::push(itemType newItem)
  // Precondition: Stack is empty.
  //Postcondition: Stack contains a itemType  at the top and list or stack implements     by 1.
   {  
             if(top!=NULL)    
     node *newTop;
             newTop=new node;
    (*newTop).item=newItem;
         (*newTop).next=top;
          top=newTop;

 }

Ответы [ 4 ]

2 голосов
/ 31 октября 2011

В вашей функции push () вы возвращаете Void. Тем не менее вы пытаетесь написать значение, которое возвращает функция в командной строке - либо измените свою функцию push вернуть значение или cout << stack.pop (); </p>

Далее:
Вам нужно перегрузить оператор << для вашего класса newstack, чтобы иметь возможность писать что-то вроде: </p>

newstack obj;
cout<<obj;

<< перегружен только для встроенных типов данных, а не для пользовательских классов.

Вам нужно перегрузить его примерно так:

std::ostream& operator<<(std::ostream& os, const newstack& obj);
1 голос
/ 01 ноября 2011

См. Следующее

#include <iostream>

using namespace std;

//Defenitions

template <class T>
struct Node
{
    T DataMember;
    Node* Next;
};

template <class T>
class NCA
{
    public:
        NCA();
        ~NCA();
        void push(T);
        T pop();
        void print();
        void Clear();
    private:
        Node<T>* Head;
        void* operator new(unsigned int);
};

//Imp.

template <class T>
NCA<T>::NCA()
{
    Head = NULL;
}

template <class T>
NCA<T>::~NCA()
{
    Clear();
}

template <class T>
void NCA<T>::push(T value)
{
    Node<T>* Temp = new Node<T>;

    Temp->DataMember = value;
    Temp->Next = Head;
    Head = Temp;
}

template <class T>
T NCA<T>::pop()
{
    Node<T>* n;
    T i;
    n = Head->Next;
    i = Head->DataMember;
    delete Head;
    Head = n;
    return i;
}

template <class T>
void NCA<T>::print()
{
    Node<T>* MockHead = Head;

    while (MockHead != NULL)
    {
        cout << MockHead->DataMember;
        MockHead = MockHead->Next;
    }
}

template <class T>
void NCA<T>::Clear()
{
    while(Head != NULL)
        pop();
}

//Main Execution

int main()
{
    NCA<char> Array;
    Array.push('c');
    cout << Array.pop();
    return 0;
}
1 голос
/ 31 октября 2011
cout<<(number).push(x)<<endl;

Во-первых, вам не нужно () вокруг number

cout << number.push(x) << endl;

Это все равно не сработает, потому что newstack::push возвращает void.

Либо измените newstack::push, чтобы вернуть добавленное значение, либо напечатайте число на отдельном шаге.

0 голосов
/ 31 октября 2011

Вы не переопределили оператор << для вашего нового стека, который вызывает ошибку.Если вы напечатали x, а затем сделали push, вы не получите сообщение об ошибке.Если вы хотите, чтобы cout мог печатать ваш стек, вам нужно определить, КАК оператор << работает. </p>

Реальная проблема здесь в том, как вы ожидаете, что ваш код будет работать.Во-первых, push не должен возвращать значение для начала, это не то, как работает стек.Вы можете реализовать pop, который выскочит и вернет верхнее значение стека, однако тогда вы потеряете это значение.Вам нужно реализовать Peek.Поскольку это домашнее задание, я не буду давать вам прямой ответ о том, как писать вглядываться, но это должен быть лучший способ выполнения вашего кода.

for (x=0; x<=9; x++)
{
    number.push(x);
    cout << number.peek() << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...