2016-10-11 122 views
-4

我想創建一個程序,將使用堆棧反轉鏈接列表;然而,我不斷得到同樣的錯誤,我不能設置一個節點等於一個int,但我已經看到了多個例子,這是可能的!我可能做錯了什麼?無效的轉換從'int'到'nodeType <int>'

這是代碼。

#include<iostream> 
#include<fstream> 

using namespace std; 


#include "linkedStack.h" 
nodeType<int> *head = NULL; 
void traversal(linkedStackType<int>); 

int main(){ 

    linkedStackType<int> Estack; 
    linkedStackType<int> Ostack; 
    linkedStackType<int> Tstack; 
    Estack.initializeStack(); 
    Ostack.initializeStack(); 
    int num; 

    for (int i = 0; i < 10; i++) 
    { 
    cout << "Hello! Enter a number.\n"; 
    cin >> num; 
     if (num % 2 == 0) 
     { 
      cout << "This number is even! It's going to the even stack.\n"; 
      Estack.push(num); 
     } 
     else 
     { 
      cout << "This number is odd! It's going to the odd stack.\n"; 
      Ostack.push(num); 
     } 
    } 
    traversal(Estack); 
    traversal(Ostack); 

    system("Pause"); 
    return 0; 
} 
void traversal(linkedStackType<int> stack) 
{ 
    nodeType<int> *current = NULL, *first = NULL; 
     current = first; 
     while (current != NULL) { 
     stack.push(current->info); 
     current = current->link; 
    } 
    while (stack.isEmptyStack() != true){ 
     current=stack.top(); 
     stack.pop(); 
     cout << current->info << " "; 
    } 
} 

linkedStack.h

#ifndef H_StackType 
#define H_StackType 

#include <iostream> 
#include <cassert> 
using namespace std; 

#include "stackADT.h" 

template <class Type> 
struct nodeType 
{ 
    Type info; 
    nodeType<Type> *link; 
}; 

template <class Type> 
class linkedStackType :public stackADT<Type> 
{ 
public: 
    linkedStackType(); 

    //Default constructor 
    //Postcondition: stackTop = NULL; 

    Type top() const; 

    //Function to return the top element of the stack. 
    //Precondition: The stack exists and is not empty. 
    //Postcondition: If the stack is empty, the program 
    // terminates; otherwise, the top element of 
    // the stack is returned. 
    const linkedStackType<Type>& operator= 
     (const linkedStackType<Type>&); 
    //Overload the assignment operator. 

    bool isEmptyStack() const; 
    //Function to determine whether the stack is empty. 
    //Postcondition: Returns true if the stack is empty; 
    // otherwise returns false. 

    bool isFullStack() const; 

    //Function to determine whether the stack is full. 
    //Postcondition: Returns false. 

    void push(const Type& newItem); 

    //Function to add newItem to the stack. 
    //Precondition: The stack exists and is not full. 
    //Postcondition: The stack is changed and newItem is 
    // added to the top of the stack. 

    void initializeStack(); 

    //Function to initialize the stack to an empty state. 
    //Postcondition: The stack elements are removed; 
    // stackTop = NULL; 
    void pop(); 

    //Function to remove the top element of the stack. 
    //Precondition: The stack exists and is not empty. 
    //Postcondition: The stack is changed and the top 
    // element is removed from the stack. 

    linkedStackType(const linkedStackType<Type>& otherStack); 
    //Copy constructor 
    //~linkedStackType(); 

    //Destructor 
    //Postcondition: All the elements of the stack are removed 
private: 

    nodeType<Type> *stackTop; //pointer to the stack 

    void copyStack(const linkedStackType<Type>& otherStack); 
    //Function to make a copy of otherStack. 
    //Postcondition: A copy of otherStack is created and 
    // assigned to this stack. 
}; 


template <class Type> 
linkedStackType<Type>::linkedStackType() 
{ 
    stackTop = NULL; 
} 

template <class Type> 
bool linkedStackType<Type>::isEmptyStack() const 

{ 
    return(stackTop == NULL); 
} //end isEmptyStack 

template <class Type> 
bool linkedStackType<Type>::isFullStack() const 
{ 
    return false; 
} //end isFullStack 
template <class Type> 

void linkedStackType<Type>::initializeStack() 

{ 

    nodeType<Type> *temp; //pointer to delete the node 
    while (stackTop != NULL) //while there are elements in 
          //the stack 
    { 
     temp = stackTop; //set temp to point to the 
         //current node 
     stackTop = stackTop->link; //advance stackTop to the 
            //next node 
     delete temp; //deallocate memory occupied by temp 
    } 
} //end initializeStack 

template <class Type> 
void linkedStackType<Type>::push(const Type& newElement) 
{ 
    nodeType<Type> *newNode; //pointer to create the new node 
    newNode = new nodeType<Type>; //create the node 
    newNode->info = newElement; //store newElement in the node 
    newNode->link = stackTop; //insert newNode before stackTop 
    stackTop = newNode; //set stackTop to point to the 
        //top node 
} //end push 
template <class Type> 
void linkedStackType<Type>::pop() 

{ 
    nodeType<Type> *temp; //pointer to deallocate memory 
    if (stackTop != NULL) 

    { 
     temp = stackTop; //set temp to point to the top node 
     stackTop = stackTop->link; //advance stackTop to the 
            //next node 
     delete temp; //delete the top node 
    } 
    else 
     cout << "Cannot remove from an empty stack." << endl; 
}//end pop 

template <class Type> 
Type linkedStackType<Type>::top() const 
{ 
    assert(stackTop != NULL); //if stack is empty, 
           //terminate the program 
    return stackTop->info; //return the top element 
}//end top 

template <class Type> 
void linkedStackType<Type>::copyStack(const linkedStackType<Type>& otherStack) 
{ 
    nodeType<Type> *newNode, *current, *last; 
    if (stackTop != NULL) //if stack is nonempty, make it empty 
     initializeStack(); 
    if (otherStack.stackTop == NULL) 
     stackTop = NULL; 
    else 
    { 
     current = otherStack.stackTop; //set current to point 
             //to the stack to be copied 
             //copy the stackTop element of the stack 
     stackTop = new nodeType<Type>; //create the node 
     stackTop->info = current->info; //copy the info 
     stackTop->link = NULL; //set the link field to NULL 
     last = stackTop; //set last to point to the node 
     current = current->link; //set current to point to the 
           //next node 
      //copy the remaining stack 

      while (current != NULL) 

      { 
       newNode = new nodeType<Type>; 
       newNode->info = current->info; 
       newNode->link = NULL; 
       last->link = newNode; 
       last = newNode; 
       current = current->link; 
      }//end while 
    }//end else 
} //end copyStack 

template <class Type> 
const linkedStackType<Type>& linkedStackType<Type>::operator=(const linkedStackType<Type>& otherStack) 
{ 
    if (this != &otherStack) //avoid self-copy 
     copyStack(otherStack); 
    return *this; 
}//end operator= 
template <class Type> 

linkedStackType<Type>::linkedStackType(const linkedStackType<Type>& otherStack) 
{ 
    stackTop = NULL; 
    copyStack(otherStack); 
}//end copy constructor 



#endif 

stackADT.h

template <class Type> 
class stackADT 

{ 
public: 

    virtual void initializeStack() = 0; 

    //Method to initialize the stack to an empty state. 

    //Postcondition: Stack is empty. 

    virtual bool isEmptyStack() const = 0; 

    //Function to determine whether the stack is empty. 

    //Postcondition: Returns true if the stack is empty, 

    // otherwise returns false. 

    virtual bool isFullStack() const = 0; 

    //Function to determine whether the stack is full. 

    //Postcondition: Returns true if the stack is full, 

    // otherwise returns false. 

    virtual void push(const Type& newItem) = 0; 

    //Function to add newItem to the stack. 

    //Precondition: The stack exists and is not full. 

    //Postcondition: The stack is changed and newItem is added 

    // to the top of the stack. 

    virtual Type top() const = 0; 

    //Function to return the top element of the stack. 

    //Precondition: The stack exists and is not empty. 

    //Postcondition: If the stack is empty, the program 

    // terminates; otherwise, the top element of the stack 

    // is returned. 

    virtual void pop() = 0; 

    //Function to remove the top element of the stack. 

    //Precondition: The stack exists and is not empty. 

    //Postcondition: The stack is changed and the top element 

    // is removed from the stack. 

}; 
視覺工作室

確切錯誤:

類型的 「INT」 的值不能被分配給實體類型「nodeType *」

任何意見,將不勝感激。

+0

'類型top()const'返回'Type'(在你的情況下是'int')。 'current = stack.top();''current''是'nodeType *','current'不是'int',它是指向'節點類型'的指針。所以...錯誤。有什麼不清楚的? – WhozCraig

+0

Off topic:在'void traversal(linkedStackType stack)','linkedStackType stack'作爲局部變量比作爲參數更有意義。 – user4581301

+0

「使用堆棧反轉鏈接列表」與「將堆棧實現爲鏈接列表並將其反向打印」不同。你究竟想要做哪一件? – molbdnilo

回答

0

首先,你應該改變Type top() const;nodeType<Type>* top() const;"linkedStack.h""stackADT.h"。而你應該在「stackADT.h」從stackADT .Additionally添加template <class Type>struct nodeType;因爲linkedStackType派生,Type top() const應作如下修改:

template <class Type> 
nodeType<Type>* linkedStackType<Type>::top() const 
{ 
    assert(stackTop != NULL); //if stack is empty, 
           //terminate the program 
    return stackTop; //return the top element 
}//end top 

通過這種方式,我成功地編譯了項目。

但是,函數void traversal(linkedStackType<int> stack)中存在一些算法問題。 currentfirst都是NULL指針。那麼current指向何時use current -> info?我認爲你應該修改這個功能void traversal(linkedStackType<int> stack)

相關問題