21.2.2 使用栈内存
由于栈是由系统来管理,所以不会直观地感觉到在使用栈,除非程序自己来模拟一个栈。
【示例21-5】 局部变量自动从栈上获得存储空间。
- void main()
- {
- int a; //在栈上分配空间
- int b; //在栈上分配空间
- int c; //在栈上分配空间
- a = 25; //赋值
- b = 68; //赋值
- c = a + b; //使用 a, b对c赋值
- std::cout << "the value of a + b is : " << c; //使用c
- }
分析:该示例有3个局部变量,都从栈上获得内存空间。每个变量的名字与一个栈上空间相对应。由于栈由系统来管理,所以使用时程序没有特别需要注意的地方。因此使用栈时,只需给出对应的变量名即可。
【示例21-6】 补全了示例21-4,演示了用指针链模拟栈的方法,以说明栈的操作原理。
- class intstack
- {
- public:
- intstack();
- ~intstack();
- private:
- struct tagint
- {
- int x; //保存数据
- struct tagint *p; //指向下一个节点
- } *value;
- public:
- void push(int y); //压栈
- int pop(); //出栈
- int gettop(); //得到栈顶元素的值
- }
- intstack::intstack()
- {
- value=(struct tagint *)malloc(sizeof(struct tagint)); //申请内存空间
- }
- intstack::~intstack()
- {
- //释放
- struct tagint *st;
- st=value->p;
- while(st!=null)
- {
- value->p=st->p; //指向下一个位置
- free(st); //释放
- st=value->p; //指向下一个位置
- }
- free(value);
- }
- //压栈
- void intstack::push(int y)
- {
- struct tagint *st;
- st=(struct tagint *)malloc(sizeof(struct tagint)); //申请内存空间
- st->x=y; //赋值
- st->p=value->p; //指向当前链头
- value->p=st; //链到栈头
- }
- //得到栈顶元素的值
- int intstack:: gettop ()
- {
- return value->p->x; //返回栈顶元素的值
- }
- //返回栈顶元素的值,同时删除栈顶
- int intstack::pop()
- {
- int y=value->p->x; //栈顶值
- struct tagint *st;
- st=value->p; //栈顶元素
- value->p=value->p->p; //下一个元素成为栈顶
- free(st); //释放
- return y; //返回栈顶元素的值
- }
分析:该示例是个简单的用链模拟栈的类,从它使用内存的方式来看不是栈空间,而是动态分配空间。它用一个链来模拟一个先进后出的栈,用push()模拟压栈,gettop()模拟取栈顶元素,pop()在取栈顶元素的同时删除当前栈顶。这个示例演示了栈的基本操作原理,让读者对栈的使用有一个直观的理解。
【责任编辑:云霞 TEL:(010)68476606】
| 回书目 上一节 下一节 |