对于一个堆栈小程序的几点疑惑
yiqi的问题
这是书上的一个例子,已经编译通过了,有几点不明白,麻烦大家看一看。
//对堆栈进行处理的程序,包括压栈和出栈操作
#include <iostream.h>
class Stack
{
struct Node
{
int content;
Node *next;
} *top;
public:
Stack(){top=NULL;} //构造函数定义
bool push(int i); //压栈成员函数声明
bool pop(int &i); //出栈成员函数声明
};
bool Stack::push(int i) //压栈成员函数的定义
{
Node *p=new Node;
if(p==NULL)
{
cout < < "Stack is overflow.\n ";
return false;
}
else
{
p-> content=i;
p-> next=top;
top=p;
return true;
}
}
bool Stack::pop(int &i) //出栈成员函数的定义
{
if(top==NULL)
{
cout < < "Stack is empty.\n ";
return false;
}
else
{
Node *p=top;
top=top-> next;
i=p-> content;
delete p;
return true;
}
}
void main()
{
Stack st1,st2; //定义对象st1和st2
int x;
for(int i=1;i <=5;i++)
{
st1.push(i); //压栈成员函数的调用
st2.push(i); //压栈成员函数的调用
}
cout < < "stack1: " < <endl;
for( i=1;i <=3;i++)
{
st1.pop(x); //出栈成员函数的调用
cout < <x < <endl;
}
st1.push(20);
for( i=1;i <=4;i++)
{
if(st1.pop(x))
cout < <x < <endl;
else
break;
}
cout < < "stack2: " < <endl;
while(st2.pop(x))
cout < <x < <endl;
}
1,想不明白为什么出栈成员函数bool pop(int &i)的参数要是地址变量 int &i而不是int i,这样做的目的是什么
2,在MAIN函数中,只定义了第一个FOR循环中的i变量, 第二个和第三个FOR循环中的i变量没有定义。我试图改为for( int i=1;i <=3;i++)和for(int i=1;i <=4;i++),但是编译时系统报错:declaration of i
http://bbs.csai.cn/bbs/view.asp?id={D7C3AA85-2096-427D-825D-75246E67EC28}
[解决办法]
1。因为int i是值传递,int &i是引用
值传递无法改变i的值,引用和指针可以,lz应该注意它们的区别
2。你的编译器是什么?有的编译器认为你的i重定义了
[解决办法]
1.bool pop(int &i)
其中int &i为i的引用,是C++的(C中没有),随便一本C++的书都有介绍,当然你也可用int *i;
2.的确与编译器有关,在BCB与gcc中,for(int i...)中的i的作用域为for遁环体内(你上面的程序不能被编译通用),而vc就是在该i定义之后直到函数结束
但我还没有碰到过;
for(int i....)
...
for(int i...)
不能编译的编译器
3.#include <iostream.h>
这个头文件是老的STL的(你的书应该是较旧的了)
一般现在用
#include <iostream>
using namespace std;
否则你的新版的编译器(如vc2003)下,程序不能被编译