使用指针表示堆栈
Representing a stack using pointers
我似乎不懂C++中的指针,我希望我的例子能帮助你指导我我有以下代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
头等舱:
class Node
{
private:
int value;
Node *next;
public:
Node()
{
value = 0;
}
~Node()
{
}
void setValue(int x)
{
value = x;
}
int getValue()
{
return value;
}
void setNext(Node x)
{
next = &x;
}
Node getNext()
{
return *next;
}
};
二等:
class Stack
{
private:
Node *top;
public:
Stack()
{
top = NULL;
}
~Stack()
{
}
Node pop()
{
Node *temp = top;
top = &top->getNext();
return *temp;
}
void push(Node &x)
{
x.setNext(getTop());
setTop(x);
}
Node getTop()
{
return *top;
}
void setTop(Node x)
{
top = &x;
}
};
主要功能:
int main()
{
Node a;
Node b;
a.setValue(1);
b.setValue(2);
Stack s;
s.push(a);
s.push(b);
cout << s.pop().getValue() << endl;
cout << s.pop().getValue() << endl;
return 0;
}
我一直得到随机数,我知道我在使用对象和指针时有问题,我就是不知道我的问题是什么
为成员变量的参数分配指针是完全无用的,因为参数从函数返回时会消失,指针也会变得毫无意义。
class Node
{
private:
int value;
Node *next;
public:
Node()
{
value = 0;
}
~Node()
{
}
void setValue(int x)
{
value = x;
}
int getValue()
{
return value;
}
void setNext(Node* x) // setNext takes a pointer, not a Node by value.
{
next = x;
}
Node *getNext()
{
return next;
}
};
和
class Stack
{
private:
Node *top;
public:
Stack()
{
top = NULL;
}
~Stack()
{
}
Node pop()
{
Node *temp = top;
top = top->getNext();
return *temp;
}
void push(Node &x)
{
x.setNext(getTop());
setTop(&x);
}
Node *getTop()
{
return top;
}
void setTop(Node *x) // setTop takes a pointer, not a Node by value.
{
top = x;
}
};
我担心这个实现可能对应用程序来说是危险的,但它在这里会起作用。
Node::setNext
、Node::getNext
、Stack::getTop
和Stack::setTop
都返回/传递值,这些值在某些时候超出了范围。应该有引用,这将导致堆栈指向原始的Node a
和Node b
,当它们不再使用时,它们在main
末尾超出范围。
但这一切都错了您应该将副本存储在堆上,而不仅仅是指向具有自动存储持续时间的对象的指针。
让getter/setter返回指针而不是对象。此代码:
Node *temp = top;
top = &top->getNext();
return *temp;
将temp
分配给top
,然后将top
分配给由getNext()
创建的临时对象的地址,然后返回temp
所指向的对象。下次使用top
将导致未定义的行为,因为top
现在是一个悬空指针。
节点:
class Node
{
private:
int value;
Node *next;
public:
Node()
{
value = 0;
}
~Node()
{
}
void setValue(int x)
{
value = x;
}
int getValue()
{
return value;
}
void setNext(Node* x)
{
next = x;
}
Node* getNext()
{
return next;
}
};
堆栈:
class Stack
{
private:
Node *top;
public:
Stack()
{
top = NULL;
}
~Stack()
{
}
Node pop()
{
Node *temp = top;
top = top->getNext();
return *temp;
}
void push(Node* x)
{
x->setNext(getTop());
setTop(x);
}
Node* getTop()
{
return top;
}
void setTop(Node* x)
{
top = x;
}
};
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 为什么调用堆栈数组会导致内存泄漏
- 如何计算Big-O表示法中的平均渐近运行时间
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 使用指针计算堆栈问题的大 O 表示法
- 前缀表示法 C++,分段错误(堆栈和队列)
- 堆栈后缀表示法评估等于中缀计算得到的不同
- 后缀表示法堆栈C++
- 使用指针表示堆栈