Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从char&x27;s_C++_Stack - Fatal编程技术网

C++ 从char&x27;s

C++ 从char&x27;s,c++,stack,C++,Stack,我试图实现一个基本的字符堆栈,以增加我对堆栈的理解。我不明白为什么我能够正确地推到堆栈上,但是我不能从堆栈中弹出,我得到了一个seg错误 这是我的头文件 #include <iostream> using namespace std; class Stack { public: Stack(int = 10); Stack(const Stack&); ~Stack();

我试图实现一个基本的字符堆栈,以增加我对堆栈的理解。我不明白为什么我能够正确地推到堆栈上,但是我不能从堆栈中弹出,我得到了一个seg错误

这是我的头文件

#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()
    将从未初始化的内存中返回数据,因此尝试弹出的
    char
    s将成为垃圾
  • 在构造函数中,可以使用初始值设定项列表而不是赋值:

    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])
{ }