我正在尝试创建一个程序,它将使用堆栈反转链表;但是,我不断得到同样的错误,我不能设置一个等于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.
};
visual studio上的确切错误:
“int”类型的值不能分配给“nodeType *”
类型的实体任何建议都将受到赞赏。
答案 0 :(得分:0)
首先,您应该将Type top() const;
更改为nodeType<Type>* top() const;
和"linkedStack.h"
中的"stackADT.h"
。并且您应该在&#34; stackADT中添加template <class Type>struct nodeType;
。 H&#34;因为linkedStackType
来自stackADT
。此外,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)
中存在一些算法问题。 current
和first
都是NULL指针。那么当您current
时use current -> info
指向什么?我认为你应该修改这个函数void traversal(linkedStackType<int> stack)
。