我正在尝试用c++编写堆栈,但似乎遇到了问题。
#include "stdafx.h"
#include <iostream>
using namespace std;
class Node {
public:
int node_value;
Node * previous_node;
};
class Stack {
public:
Node * node_pointer;
int size = 0;
void push(int number) {
Node NewNode;
NewNode.node_value = number;
cout << number << endl;
if (size == 0) {
node_pointer = &NewNode;
cout << node_pointer << endl;
size += 1;
cout << "Pushed" << endl;
}
else if (size > 0)
{
NewNode.previous_node = node_pointer;
node_pointer = &NewNode;
cout << "Pushed" << endl;
size += 1;
}
}
void pop() {
if (size > 1) {
Node Temp_Node = *node_pointer;
cout << Temp_Node.node_value << endl;
node_pointer = Temp_Node.previous_node;
size -= 1;
}
else if (size == 1){
size -= 1;
Node Temp = *node_pointer;
cout << Temp.node_value;
}
else {
cout << "empty" << endl;
}
}
};
int main()
{
Stack stack;
Node a;
Node b;
Node * p1;
int num = 5;
a.node_value = num;
p1 = &a;
b = *p1;
cout << b.node_value << endl;
stack.push(10);
stack.pop();
system("PAUSE");
return 0;
}
它返回的不是节点值,而是一个地址。我有点困惑,因为当我对节点做同样的事情时,它工作得很好。在堆栈中,我将地址复制到指针node_pointer中,当我通过取消指针的引用来创建新节点时,它会返回完全不同的实例变量。
发布于 2018-06-02 09:01:51
问题来自于函数push(),'newNode‘是堆栈上的一个变量,编译器将在函数结束时自动调用其析构函数。
为了避免这种情况,您应该使用'new‘操作符在堆上创建'newNode’,函数pop()负责释放内存(使用'delete‘操作符)。
如果'new‘和'delete’操作符让你感到困惑,你可以使用'std::shared_ptr‘代替。
void push(int number) {
Node *NewNode = new Node{};
NewNode->node_value = number;
if (size == 0) {
node_pointer = NewNode;
cout << node_pointer << endl;
size++;
cout << "Pushed" << endl;
}
else if (size > 0)
{
NewNode->previous_node = node_pointer;
node_pointer = NewNode;
size++;
cout << "Pushed" << endl;
}
}
void pop() {
if (size > 1) {
Node* Temp_Node = node_pointer;
cout << Temp_Node->node_value << endl;
delete node_pointer;
node_pointer = Temp_Node->previous_node;
size--;
}
else if (size == 1) {
Node* Temp = node_pointer;
cout << Temp->node_value << endl;
delete node_pointer;
node_pointer = nullptr;
size--;
}
else {
cout << "empty" << endl;
}
}
你也可以利用SmartPointer的优势:你没有责任在堆上‘新建’和‘删除’对象。
#include <memory>
using namespace std;
class Node {
using node_ptr = std::shared_ptr<Node>;
public:
int node_value;
node_ptr previous_node;
};
class Stack {
using node_ptr = std::shared_ptr<Node>;
public:
node_ptr node_pointer = nullptr;
int size = 0;
void push(int number) {
node_ptr NewNode = std::make_shared<Node>();
NewNode->node_value = number;
if (size == 0) {
node_pointer = NewNode;
cout << node_pointer << endl;
size++;
cout << "Pushed" << endl;
}
else if (size > 0)
{
NewNode->previous_node = node_pointer;
node_pointer = NewNode;
size++;
cout << "Pushed" << endl;
}
}
void pop() {
if (size > 1) {
node_ptr Temp_Node = node_pointer;
cout << Temp_Node->node_value << endl;
//delete node_pointer;
//no need to delete here, it will be automatically destructed when Temp_Node leaves this scope.
node_pointer = Temp_Node->previous_node;
size--;
}
else if (size == 1) {
node_ptr Temp = node_pointer;
cout << Temp->node_value << endl;
//delete node_pointer;
node_pointer = nullptr;
size--;
}
else {
cout << "empty" << endl;
}
}
};
https://stackoverflow.com/questions/50652571
复制相似问题