VC++2012编程演练数据结构《5》堆栈实现递归运算

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
  栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
  栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
  以上定义是在经典计算机科学中的解释。
  在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址增大,弹出的操作使得栈顶的地址减小。
  栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:
  1. 函数的返回地址和参数

  2. 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。

学过编译原理的人都知道解析任意计算表达式不是个轻松的活

我们来用堆栈实际解决解析任意计算表达式

打开IDE


我们基于VC++2012创建一个工程



类代码如下

#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
class list;
class listnode{
	friend class list;
	int data;
	listnode *link;
	listnode(int value,listnode *zz):data(value),link(zz)
	{}
};
class list{
	listnode *first;
	//累加和
	long sum(listnode *p);
	//计数器
	long count(listnode *p);
public:
	list():first(NULL){}
	//生成栈
	void add(int value);
	//显示栈中数据
	void display();
	//获取累加和
	long get_sum(){return sum(first);}
	//获取数据个数
	long get_count(){return count(first);}
	//求平均
	float get_avg()
	{return (float)sum(first)/count(first);}
};
void list::add(int value){
	listnode *p=new listnode(value,first);
	if(p!=NULL) first=p;
	else cerr <<"Memory Error!" <<endl;
}
void list::display(){
	cout<<"数据域的各个值:";
	for(listnode *p=first;p!=NULL;p=p->link)
		cout<<setw(2)<<p->data;
	cout <<endl;
}
long list::sum(listnode *p){
	if(p->link==NULL) return p->data;
	else return p->data+sum(p->link);
}
long list::count(listnode *p){
	long n=1;
	if(p->link==NULL){return 1;}
	else{return count(p->link)+n;}
}



调用代码如下


void main()
{
cout<<"运行结果:\n";
list a;
a.add(1);
a.add(2);
a.add(3);
a.add(4);
a.add(5);
a.add(6);
a.add(7);
a.add(8);
a.add(9);
a.display();
cout<<"累加和sum="<<a.get_sum()<<endl;
cout<<"数据个数count="<<a.get_count()<<endl;
cout<<"平均值avg="<<a.get_avg()<<endl;
cin.get();
}



效果如下




代码下载地址


http://download.csdn.net/detail/yincheng01/4785718

原文地址:https://www.cnblogs.com/new0801/p/6177659.html