我已经编写并修改了C ++书籍中关于从堆栈类推送/弹出数字的示例代码。这是一个基本问题,仅供我理解。这是代码。
//stakarray.cpp
//a stack as a class
#include <iostream>
using namespace std;
class Stack
{
private:
enum { MAX = 10 };
//int MAX=10;
int st[MAX];
int top;
public:
Stack()
{ top=0; }
void push(int var)
{ st[++top]=var; } //increments stack, input var
int pop()
{ return st[top--]; } //returns var, decrements stack
void show(int var)
{ cout << st[var]<< endl; }
};
int main()
{
//some stack operations
int i;
Stack s1;
s1.push(11);
s1.push(22);
cout<<"1: "<<s1.pop()<<endl; //22
cout<<"2: "<<s1.pop()<<endl; //11
s1.push(33);
s1.push(44);
s1.push(55);
s1.push(66);
for (i=0; i<= 10 ; i++)
{
cout<< "s1[" << i << "]= ";
s1.show(i);
}
return 0;
}
该程序的输出给出了
1: 22
2: 11
s1[0]= 2
s1[1]= 33
s1[2]= 44
s1[3]= 55
s1[4]= 66
s1[5]= 0
s1[6]= 0
s1[7]= 0
s1[8]= 4196896
s1[9]= 0
s1[10]= 4
为什么s1 [0] = 2,s1 [8] = 4196896,s1 [10] = 4?是否有任何方法可以从私有访问MAX,或者我必须在类中的其他位置定义它(不使用全局变量或main()的一部分)?
答案 0 :(得分:2)
从不使用元素0,因为在推送中使用预增量(++ top)而不是后增量(top ++)。
您的堆栈一次最多包含4个元素,因此索引4后面的所有元素都有未定义的内容(即s1 [5] ... s1 [10]中的随机垃圾)。
答案 1 :(得分:1)
在您的代码中,您在设置值之前使用预增量++top
递增顶部。因此,top将转到1,然后您将设置s1[1]=33
。如果您切换为增加后top++
,则在设置top
后,您的计数器变量s[0]=33
将会增加。
//stakarray.cpp
//a stack as a class
#include <iostream>
using namespace std;
class Stack
{
private:
enum { MAX = 10 };
//int MAX=10;
int st[MAX];
int top;
public:
Stack()
{ top=0; }
void push(int var)
{ st[top++]=var; } //increments stack, input var
int pop()
{ return st[top--]; } //returns var, decrements stack
void show(int var)
{ cout << st[var]<< endl; }
};
int main()
{
//some stack operations
int i;
Stack s1;
s1.push(11);
s1.push(22);
cout<<"1: "<<s1.pop()<<endl; //22
cout<<"2: "<<s1.pop()<<endl; //11
s1.push(33);
s1.push(44);
s1.push(55);
s1.push(66);
for (i=0; i<= 10 ; i++)
{
cout<< "s1[" << i << "]= ";
s1.show(i);
}
return 0;
}