二级考试C++中的第二道操作题中有一类栈堆的问题,我个人认为很不好理解,今天终于想通了其中一道,俗话说“一通百通‘,相信弄懂了其中一道,其它的栈堆问题,理解起来,就会相对容易一些,我在这里写一下我对这道题的个人见解,还有,我对这道题中的入栈的代码过程不太理解,欢迎同学们发表个人见解。
<span style="font-family:SimHei;font-size:24px;"><strong>// 堆栈.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class Entry {//表示存储在栈中的数据项
public:
Entry* next;
int data;
//**********found**********
Entry(Entry* n, int d) : next(n), data(d) { }//Entry类的构造函数,对数据成员进行初始化
};
//在这里我们首先要想明白,因为*next和data是Entry的数据成员,而top是Entry的实例化,所以top拥有指针型的成员next和数据成员data
class Stack {//基于链式结构的栈类
Entry* top;//定义一个数据项类的指针top
public:
Stack() : top(0) { }//最初栈是一个空栈,所以顶端的指针指向空。
~Stack()//析构函数:不断将top指针赋予temp,top指针再赋予栈中下一个存储空间,然后将temp删除,直到将栈中数据删除干净(即栈顶指针指向空)
{
while (top != 0)
{
Entry* tmp = top;
//**********found**********
top = top->next;
delete tmp;
}
}
void push(int data)//将数据data填入
{
//**********found**********
top = new Entry(top++, data);//在这里调用Entry的构造函数,next指针指向当前的top处,而top指针指向当前top值加1
}
int pop()//出栈函数
{
if (top == 0) return 0;
//**********found**********
int result = top->data;
top = top->next;
return result;
}
};
int main()
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Stack s;
int i = 0;
for (i = 0; i < 10; i++) {
cout << a[i] << ' ';
s.push(a[i]);
}
cout << endl;
for (i = 0; i < 10; i++) {
cout << s.pop() << ' ';
}
cout << endl;
return 0;
}</strong></span>
下面用图形的方式表示一下,入栈和出栈的过程: