填空题 以下程序实现栈的入栈和出栈的操作。其中有两个类:一个是节点类node,它包含点值和指向上一个节点的指针 prev;另一个类是栈类 stack, 它包含栈的头指针 top。 生成的链式栈如下图所示。 〈IMG onClick=over(this) title=放大 src="tp/jsj/2jc++j28.1.gif"〉 下面是实现程序,请填空完成此程序。 #include 〈iostream〉 using namespace std; class stack; class node { int data; node *prev; public: node(int d, node *n) { data=d; prev=n; } friend class stack; }; class stack { node *top; //栈头 public: stack() { top=0; } void push(int i) { node *n=〈u〉 【13】 〈/u〉; top=n; } 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; }
  • 1、
【正确答案】 1、new node(i,top)    
【答案解析】[解析] 本题考核友元类以及对象成员的应用,属于综合考题。本程序中定义了两个类node和stack,用于实现堆栈的压入和弹出操作。其中,类 stack是类node的友元类,这样类stack中的成员可以访问类node中的所有成员。在类node中,定义两个私有变量:整型变量data和对象指针prev。变量data用于保存节点的数值,而对象指针prey用于指向上一节点。在类node的构造函数中,形参是数据d和对象指针n。在类stack中,定义了一个私有变量,栈顶指针top,并在构造函数中赋值0(即指针为空)。 函数push()实现入栈操作,即把形参i压入栈中,那么此时应该创建一个新的节点,并让这个节点的prev指针指向栈顶,即top。然后让top指针指向新的节点。所以在push()函数中应填入“node*n=new node(i,top)”。类stack中的pop()函数实现数据的弹出功能。先定义了一个对象指针t指向栈顶节点。然后判断堆栈是否为空,如果为空,则返回0,否则就弹出栈顶节点的值。那么应该先将栈顶指针后退一个节点,然后把对象t指针指向的节点值弹出,并删除节点t。