C++用类实现顺序栈

感觉初始化栈时有问题,但一直找不出,求指点迷津

#include<iostream>
#define MAX 10
using namespace std;
class Stack{
private:
    int arr[MAX];
    int top;
public:
    void initStack(Stack S);
    bool stackFull(Stack S);
    bool stackEmpty(Stack S);
    void push(Stack S,int x);
    int pop(Stack S);
    int stackTop(Stack S);
    void traverse(Stack S);
};


void Stack::initStack(Stack S)
{
    S.top=-1;
}
bool Stack::stackFull(Stack S)
{
    if(S.top=MAX) return true;
    else return false;
}
bool Stack::stackEmpty(Stack S)
{
    if(S.top==-1)  return true;
    else return false;
}
void Stack::push(Stack S,int x)
{
    if(stackFull(S)) cout<<"stackfull"<<endl;
    else{
        S.top++;
        S.arr[S.top]=x;
    }
}
int Stack::pop(Stack S)
{
    int temp;
    if(stackEmpty(S)) cout<<"stackempty"<<endl;
    else {
        temp=S.arr[S.top];
        S.top--;
        return temp;
         }

}
int Stack::stackTop(Stack S)
{
    return  S.arr[S.top];
}
void Stack::traverse(Stack S)
{
    int i=0;
    while(i<=S.top)
        cout<<S.arr[i]<<" ";
}

int main()
{
    Stack S;
    S.initStack(S);
    if(S.stackEmpty(S)) cout<<"栈为空"<<endl;
    else cout<<"栈不为空"<<endl;
    S.push(S,1);
    S.push(S,2);
    S.push(S,3);
    S.push(S,4);
    if(S.stackFull(S)) cout<<"栈满了"<<endl;
    else cout<<"栈不为满"<<endl;
    S.pop(S);
    if(S.stackFull(S)) cout<<"栈满了"<<endl;
    else cout<<"栈不为满"<<endl;
    S.traverse(S);
    return 0;
}
阅读 3.8k
2 个回答

if(S.top=MAX) return true;这里错了


试了一试,好神奇啊
1.不用构造函数或者用default构造函数,拷贝构造的时候报错
2.自己写一个无参空构造函数,拷贝构造的时候就不报错了。。。

个人估计可能是因为编译器认为作者写了构造函数有意不初始化变量,才没报错。

所以初始化部分的错误,可以通过写个构造函数解决,最好用初始化列表初始化一下top和arr,这样initStack()函数就不需要了。

另外题主你类里的函数为什么要接收自身的实例,类里面可以直接使用类中的变量(或者this显示调用),不需要传递自己啊。比如这样:

int Stack::stackTop()
{
    return this->arr[this->top];
    // return  arr[top];
}

传参对象尽量引用传递 以类形式实现栈 不需要将另一个对象传递进去 直接操作当前对象即可
非引用或指针传递对象 会调用复制构造函数拷贝一份对象的副本传递给目标函数
不会对按值传递的对象(实参)产生任何修改

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题