gpt4 book ai didi

c++ - 从 char 的堆栈中弹出(char &)fcn

转载 作者:行者123 更新时间:2023-11-28 02:38:30 24 4
gpt4 key购买 nike

我正在尝试实现一个基本的字符堆栈,以增加我对堆栈的理解。我很困惑为什么我能够正确地压入堆栈,但我无法从堆栈中弹出,我遇到了段错误。

这是我的头文件

#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;
};

这是我的实现文件,仅包含相关信息

#include <iostream>
#include "stack.h"

using namespace std;

const int MAX = 9;

Stack::Stack(int a) {
max = a;
char *data = new char[a];
int top = 0;
}

Stack::~Stack()
{
delete[] data;
data = NULL;
}


bool Stack::push(char c)
{
if(top==9)
{
cout << "stack is full" <<endl;
return false;
}
else
top++;
return c;
}

bool Stack::pop(char &c)
{
if(top==-1)
{
cout << "Stack is empty" << endl;
return false;
}
c = data[top];
top--;
return c;

}

这是我的测试文件

    #include <iostream>
#include "stack.h"
//#include "queue.h"

using namespace std;

int main()
{
Stack *stack = new Stack(10);

char s = 's';
char t = 't';
char a = 'a';
char c = 'c';
char k = 'k';

stack->push(s);
stack->push(t);
stack->push(a);
stack->push(c);
stack->push(k);
// this is where it seg faults
stack->pop(s);
stack->pop(t);
stack->pop(a);

return 0;
}

最佳答案

char *data = new char[a];
int top = 0;

这些行在构造函数中创建新的本地 变量。这意味着您类中的 data 字段永远不会被分配,因此是一个未初始化的指针;您正试图从 pop() 中未定义的内存位置读取值。

您需要改为设置对象的数据成员:

data = new char[a];
top = -1; // Should actually be -1 according to your test in pop()

一些其他注意事项:

  • push() 中,您实际上从未将参数存储在 data 中,因此它永远不会被读回。 pop() 将从未初始化的内存中返回数据,因此您尝试弹出的 char 将成为垃圾。
  • 在构造函数中,您可以使用初始化列表而不是赋值:

    Stack::Stack(int a)
    : max(a),
    top(-1),
    data(new char[a])
    { }

关于c++ - 从 char 的堆栈中弹出(char &)fcn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26725395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com