C++ 从char&x27;s
我试图实现一个基本的字符堆栈,以增加我对堆栈的理解。我不明白为什么我能够正确地推到堆栈上,但是我不能从堆栈中弹出,我得到了一个seg错误 这是我的头文件C++ 从char&x27;s,c++,stack,C++,Stack,我试图实现一个基本的字符堆栈,以增加我对堆栈的理解。我不明白为什么我能够正确地推到堆栈上,但是我不能从堆栈中弹出,我得到了一个seg错误 这是我的头文件 #include <iostream> using namespace std; class Stack { public: Stack(int = 10); Stack(const Stack&); ~Stack();
#include <iostream>
using namespace std;
class Stack {
public:
Stack(int = 10);
Stack(const Stack&);
~Stack();
Stack& operator=(const Stack&);
bool push(char);
bool pop(char &);
bool empty() const;
bool full() const;
bool clear();
bool operator==(const Stack&) const;
//friend ostream& operator<<(ostream&, const Stack&);
private:
int max;
int top;
int actual; //only used in stack (stay) implementation
char* data;
};
#包括
使用名称空间std;
类堆栈{
公众:
堆栈(int=10);
堆栈(常量堆栈&);
~Stack();
堆栈&运算符=(常量堆栈&);
布尔推(char);
布尔波普(char&);
bool empty()常量;
bool full()常量;
bool clear();
布尔运算符==(常量堆栈和)常量;
//friend ostream&operatorpop(t);
堆栈->弹出(a);
返回0;
}
这些行正在构造函数中创建新的局部变量。这意味着类中的数据
字段永远不会被赋值,因此是未初始化的指针;您正试图从pop()
中未定义的内存位置读取值
您需要改为设置对象的数据成员:
data = new char[a];
top = -1; // Should actually be -1 according to your test in pop()
其他一些注意事项:
- 在
push()
将从未初始化的内存中返回数据,因此尝试弹出的pop()
s将成为垃圾char
- 在构造函数中,可以使用初始值设定项列表而不是赋值:
Stack::Stack(int a) : max(a), top(-1), data(new char[a]) { }
top
作为顶层元素的索引,还是堆栈上的元素数,从而超过顶层一个。后者更常见,适用于初始化top=0
。但是,您需要在pop
方法中检查top==0
,并且还需要首先递减top
,并在递减后使用它来索引元素。您将top
初始化为0,但您需要测试它是否等于-1以确定它是否为空。这两个人中有一个是不对的。如前所述,您可以构造一个堆栈
,然后立即成功地调用pop()
(理论上)。您的push()
也从未实际将传递的值放入数组。@cdhowie我修复了初始化,一定是输入错误。我需要如何修改push以实际输入值,以及如何通过pop来弹出值?感谢您的帮助,seg故障不再存在。所以通过说data=newchar[a],我把它从一个局部变量移动到一个我可以处理的堆栈?另外,对于top=-1,我不需要int top=1,因为我已经在.h?matt中说过它是一个int,通过说data=new char[a]
您正在堆分配一个新的char
数组,该数组包含a
元素,并在Stack
对象的data
字段中存储指向该数组的指针char*data=new char[a]
的作用与此相同,只是它将指针存储在构造函数的本地变量中,当构造函数返回时,该变量将丢失。
char *data = new char[a];
int top = 0;
data = new char[a];
top = -1; // Should actually be -1 according to your test in pop()
Stack::Stack(int a)
: max(a),
top(-1),
data(new char[a])
{ }