C++ 堆栈在C++;使用双LL失败,出现异常“;EXC错误访问(代码=2,地址=0x7fff5df48ff8)和x201D;
目标: 我已经用双链表实现了一个堆栈。我使用的是双链表,因为输入大小是10亿,而使用任何其他数据结构都不会得到最佳解决方案 问题: 我在类MyStack()中声明了两个对象,称为root和tail。我想将这两个对象的值初始化为NULL。稍后,当我第一次调用push()方法时,它将覆盖对象root和tail的值。 在我的例子中,代码失败,出现一个异常,“EXC_BAD_ACCESS(code=2,address=0x7fff5df48ff8),因为root的值不是NULL。我不确定应该在哪里初始化这些值,以便在调用push()之前不会覆盖root和tail 以下是.h文件:C++ 堆栈在C++;使用双LL失败,出现异常“;EXC错误访问(代码=2,地址=0x7fff5df48ff8)和x201D;,c++,C++,目标: 我已经用双链表实现了一个堆栈。我使用的是双链表,因为输入大小是10亿,而使用任何其他数据结构都不会得到最佳解决方案 问题: 我在类MyStack()中声明了两个对象,称为root和tail。我想将这两个对象的值初始化为NULL。稍后,当我第一次调用push()方法时,它将覆盖对象root和tail的值。 在我的例子中,代码失败,出现一个异常,“EXC_BAD_ACCESS(code=2,address=0x7fff5df48ff8),因为root的值不是NULL。我不确定应该在哪里初始化
#ifndef UNTITLED_MYSTACK_H
#define UNTITLED_MYSTACK_H
class MyStack {
void* data;
MyStack* next;
MyStack* prev;
MyStack* root;
MyStack* tail;
public:
MyStack();
MyStack(void *data);
MyStack * newNode();
void *newNode(void* data);
bool isEmpty(MyStack *root);
void push(void *data);
void *pop();
int size();
virtual ~MyStack();
};
#endif //UNTITLED_MYSTACK_H
下面是.cpp文件
#include <iostream>
#include <climits>
#include <cstdlib>
#include "MyStack.h"
using namespace std;
MyStack::MyStack() : root(NULL), tail (NULL) {} // <-- ERROR here -->
MyStack::MyStack(void *data) : data(data) {} // <-- ERROR here -->
MyStack * MyStack::newNode()
{
MyStack* stackNode;
stackNode = new MyStack();
stackNode->data = NULL;
stackNode->next = NULL;
stackNode->prev = NULL;
return stackNode;
}
void* MyStack::newNode(void* data)
{
MyStack* stackNode;
stackNode = new MyStack(data);
stackNode->data = data;
stackNode->next = NULL;
stackNode->prev = NULL;
return stackNode;
}
bool MyStack::isEmpty(MyStack *root) {
return (root == NULL);
}
void MyStack::push(void *val) {
if (isEmpty(root)) {
root->data = newNode(val);
tail->data = newNode(val);
tail->next = newNode();
tail = tail->next;
root->next = tail;
tail->prev = root;
cout << " Element pushed to stack" << tail->data << endl;
}
else {
tail->data = val;
tail->next = newNode();
tail->next->prev = tail;
tail = tail->next;
cout << " Element pushed to stack" << tail->data << endl;
}
}
void *MyStack::pop() {
if (isEmpty(tail)) {
cout << "Stack is empty" << endl;
return NULL;
}
MyStack* evictedN = new MyStack();
evictedN = tail;
tail = tail->prev;
tail->next = newNode();
tail = tail->next;
return evictedN->data;
}
int MyStack::size() {
if(isEmpty(root)) {
cout << "Size is empty" << endl;
return 0;
}
int count = 1;
while (tail->prev != NULL) {
count += 1;
tail = tail->prev;
}
return count;
}
MyStack::~MyStack() {
}
//here is my main method
int main() {
MyStack s;
elem_t* elem;
elem->value = 10;
elem->other = 10 >> 1;
s.push(elem);
cout << elem->value << endl;
cout << elem->other << endl;
cout << s.pop() << endl;
cout << s.size() << endl;
return 0;
}
#包括
#包括
#包括
#包括“MyStack.h”
使用名称空间std;
MyStack::MyStack():根(NULL),尾(NULL){}//
MyStack::MyStack(void*data):数据(data){}//
MyStack*MyStack::newNode()
{
MyStack*stackNode;
stackNode=new MyStack();
stackNode->data=NULL;
stackNode->next=NULL;
stackNode->prev=NULL;
返回堆栈节点;
}
void*MyStack::newNode(void*data)
{
MyStack*stackNode;
stackNode=新的MyStack(数据);
stackNode->data=数据;
stackNode->next=NULL;
stackNode->prev=NULL;
返回堆栈节点;
}
bool MyStack::isEmpty(MyStack*root){
返回(root==NULL);
}
void MyStack::push(void*val){
if(isEmpty(root)){
根->数据=新节点(val);
尾部->数据=新节点(val);
tail->next=newNode();
tail=tail->next;
根->下一个=尾部;
尾部->上一个=根;
cout-next=newNode();
尾部->下一步->上一步=尾部;
tail=tail->next;
cout数据;
}
int MyStack::size(){
if(isEmpty(root)){
cout-prev;
}
返回计数;
}
MyStack::~MyStack(){
}
//这是我的主要方法
int main(){
MyStack;
元素(t)元素;;
元素->值=10;
元素->其他=10>>1;
s、 推(elem);
cout value主要问题是没有区分堆栈和堆栈包含的节点。MyStack::newNode()返回的是一个全新的堆栈,而不是新节点。根据以下代码:
void MyStack::push(void *val) {
if (isEmpty(root)) {
root->data = newNode(val);
tail->data = newNode(val);
tail->next = newNode();
tail = tail->next;
root->next = tail;
tail->prev = root;
cout << " Element pushed to stack" << tail->data << endl;
}
else {
tail->data = val;
tail->next = newNode();
tail->next->prev = tail;
tail = tail->next;
cout << " Element pushed to stack" << tail->data << endl;
}
}
void MyStack::push(void*val){
if(isEmpty(root)){
根->数据=新节点(val);
尾部->数据=新节点(val);
tail->next=newNode();
tail=tail->next;
根->下一个=尾部;
尾部->上一个=根;
cout-next=newNode();
尾部->下一步->上一步=尾部;
tail=tail->next;
cout这是MyStack_class.h文件:
#ifndef MYSTACK_CLASS_H
#define MYSTACK_CLASS_H
class elem_t {
public:
int value;
int other;
elem_t() {};
elem_t(int value, int other) : value(value), other(other) {}
~elem_t() {};
};
class MyStack {
private:
void* data;
MyStack* next;
MyStack* prev;
public:
MyStack () {}
MyStack(void* val) : data(val), next(nullptr), prev(nullptr) {}
~MyStack() {}
MyStack* newNode();
MyStack* newNode(void*);
void push(void*);
void* pop();
int size();
};
#endif
~
以下是MyStack_class.cpp文件:
#include <iostream>
#include "MyStack_class.h"
#include <cstdlib>
using namespace std;
int count = 0;
MyStack* root = new MyStack();
MyStack* tail = new MyStack();;
MyStack* MyStack::newNode()
{
MyStack* stackNode;
stackNode = new MyStack();
stackNode->data = NULL;
stackNode->next = NULL;
stackNode->prev = NULL;
return stackNode;
}
MyStack* MyStack::newNode(void* data)
{
MyStack* stackNode;
stackNode = new MyStack(data);
stackNode->data = data;
stackNode->next = NULL;
stackNode->prev = NULL;
return stackNode;
}
void MyStack::push (void* val)
{
if (count == 0) {
root = newNode(val);
tail = newNode(val);
tail->next = newNode();
tail = tail->next;
root->next = tail;
tail->prev = root;
count++;
cout << "Element: " << count << " pushed to Stack" << endl;
}
else {
tail->data = val;
tail->next = newNode();
tail->next->prev = tail;
tail = tail->next;
count++;
cout << " Element " << count << " pushed to stack" << endl;
}
}
void* MyStack::pop()
{
if (count == 0) {
cout << "Stack is empty" << endl;
exit(1);
}
MyStack* evictedN = new MyStack();
tail = tail->prev;
evictedN = tail;
tail->next = tail->next->prev = NULL;
count--;
return evictedN->data;
}
int MyStack::size() {
int cnt = 0;
while(root->next != NULL) {
cnt++;
root = root->next;
}
return cnt;
}
不要标记不相关的语言。@EugeneSh:从列表中删除了C。您的问题可能从main开始:elem\t*elem;elem->value=10;
。指针没有指向任何地方,所以10
指向何处?@BoPersson:哦,不..我忘了粘贴elem\t的结构声明。我正在编辑我的代码。谢谢您指向它告诉我。@Akshaya很高兴你能更新它,但这并不会让Bo说的话变得不真实。这个序列是对未定义行为的公然调用。
#include <iostream>
#include <cstdlib>
#include "MyStack_class.h"
#define NELEM 1000
using namespace std;
void
example() {
MyStack* s = new MyStack;
for (int i = 0; i < NELEM; i++) {
elem_t* elem = new elem_t(i , i >> 1);
if (elem == NULL) {
exit(1);
}
s->push(elem);
cout << "the pushed element's value and other respectively : " << elem->value << " " << elem->other << endl;
}
cout << "Stack size : " << s->size() << endl;
for (int i = (NELEM-1); i > 0; i--) {
elem_t* elem = static_cast<struct elem_t*>(s->pop());
if (elem->value != i) {
cout << "Error: i is " << i << "and elem-value is " << elem->value << endl;
}
cout << "The popped element's value and other respectively: " << elem->value << " " << elem->other << endl;
delete elem;
}
delete s;
}
int
main()
{
example();
return 0;
}
MyStack_class: MyStack_class.o main.o
g++ MyStack_class.o main.o -o MyStack_class
MyStack_class.o: MyStack_class.cpp main.cpp
g++ -c -std=c++0x MyStack_class.cpp main.cpp
clean:
rm MyStack_class.o main.o MyStack_class