使用VC6打开考生文件夹下的工程MyProj8。此工程包含一个源程序文件MyMain8.cpp,该程序实现栈的入栈和出栈的操作。其中有两个类:一个是节点类node,它包含节点值和指向上一个节点的指针prey;另一个类是栈类stack,它包含栈的头指针top。但类的定义并不完整。
请按要求完成下列操作,将类Sample的定义补充完成:
①定义私有节点值data,它是血型的数据,以及定义一个指向上一个节点的指针prev。请在注释“//* *1* *”之后添加适当的语句。
②完成构造函数node(int d,node*n)的定义,使得私有成员data和prev分别初始化为d和n。请在注释“//* *2* *”之后添加适当的语句。
③完成类stack的成员函数push(int i)的类体内的定义。函数push()实现入栈这个操作,即把形参i压入栈中,那么此时应该创建一个新的节点,并让这个节点的prev指针指向栈顶。请在注释“//* *3 * *”之后添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件MyMain8.cpp清单如下:
//MyMain 8.cpp
#include <iostream>
using namespace std;
class stack;
class node
private:
//* * 1 * *
public:
node(int d, node *n)
//* * 2 * *
friend class stack;
;
class stack
node *top; //栈头
public:
stack()
top=0;
void push(int i)
//* * 3 * *
int pop()
node*t=top;
if(top)
top=top->prev;
int c=t->data;
delete t;
return c;
return 0;
;
int main()
stack s;
s.push(6);
s.push(3);
s.push(1);
return 0;
参考答案:
①int data;node *prev;
②data=d;prey=n;
③node *n;new node(i,top);top=n;
解析: 本题考核友元类以及对象成员的应用,属于综合考题。
本程序中定义了两个类node和stack,用于实现堆栈的压入和弹出操作。其中,类stack是类node的友元类,这样类stack中的成员可以访问类node中的所有成员。在类node中,定义两个私有变量:整型变量data和对象指针prev,变量data用于保存节点的数值,而对象指针prev用于指向上一节点。在类node的构造函数中,形参是数据d和对象指针n。在类stack中,定义了一个私有变量,栈顶指针top,并在构造函数中赋值0(即指针为空)。
函数push()实现入栈这个操作,即把形参i压入栈中,那么此时应该创建一个新的节点,并让这个节点的prey指针指向栈顶,即top。然后让top指针指向新的节点。所以在push()函数中应填入:
node*n==B_ewnode(i,top);top==n;
类stack中的pop()函数实现数据的弹出功能。先定义了一个对象指针t指向栈顶节点。然后判断堆栈是否为空,如果为空,则返回0,否则就弹出栈顶节点的值。那么应该先将栈顶指针后退一个节点,然后把对象t指针指向的节点值弹出,并删除节点t。