当我使用构造函数defination运行下面的程序时,在执行最后一个pop函数后输出为-1。
#define SIZE 100
class stack
{
private:
int tos;
int arr[SIZE];
public:
stack(){tos=0;}
int push(int);
int pop();
};
int stack::push(int i)
{
if(tos==SIZE)
{cout<<"stack is full\n";}
arr[tos]=i;
tos++;
return 0;
}
int stack::pop ()
{
if(tos==0)
{cout<<"stack is empty\n";}
tos--;
return arr[tos];
}
int main()
{
stack stack1;
stack1.push(1);
stack1.push(2);
stack1.push(3);
cout<<stack1.pop();
cout<<stack1.pop();
cout<<stack1.pop();
cout<<stack1.pop();
return 0;
}
但是当我尝试使用静态初始化运行时,相同的程序会给出垃圾值。
#define SIZE 100
class stack
{
private:
static int tos;
int arr[SIZE];
public:
int push(int);
int pop();
};
int stack :: tos = 0;
int stack::push(int i)
{
if(tos==SIZE)
{cout<<"stack is full\n";}
arr[tos]=i;
tos++;
return 0;
}
int stack::pop ()
{
if(tos==0)
{cout<<"stack is empty\n";}
tos--;
return arr[tos];
}
int main()
{
stack stack1;
stack1.push(1);
stack1.push(2);
stack1.push(3);
cout<<stack1.pop();
cout<<stack1.pop();
cout<<stack1.pop();
cout<<stack1.pop();
return 0;
}
答案 0 :(得分:1)
这是因为未定义的行为。当你按或弹出时,你检查它是否正常,但是继续操作,即使它不是。
因此,当您按三次,然后弹出四次时,您将使用pop
函数中的负索引索引数组。
答案 1 :(得分:1)
你们两个程序都有同样的错误:
int stack::pop ()
{
if(tos==0)
{cout<<"stack is empty\n";}
tos--;
return arr[tos];
}
你试图让一个元素超出数组范围。这会导致未定义的行为。 push
函数中的相同内容。
答案 2 :(得分:0)
推送和弹出功能应更改为,
#define SUCCESS 0
#define FAILURE 1
stack::stack(){tos=-1;}
int stack::push(int i)
{
if(tos==SIZE)
{
cout<<"stack is full\n";
return FAILURE;
}
else {
arr[++tos]=i;
}
return SUCCESS;
}
int stack::pop ()
{
if(tos==-1)
{
cout<<"stack is empty\n";
throw "Stack is Empty"; //Throw the exception, handle the exception in main
}
else
{
return arr[tos--];
}
}