• 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

  • 相关阅读:
    go test 下篇
    go test 上篇
    利用Docker Compose快速搭建本地测试环境
    phinx:php数据库迁移
    tp5 r3 一个简单的SQL语句调试实例
    TP开发小技巧
    优酷真实视频地址解析——2014年10月7日
    霍夫变换
    Google Earth影像数据破解之旅
    线程理论:(四)锁优化
  • 原文地址:https://www.cnblogs.com/new0801/p/6177659.html
Copyright © 2020-2023  润新知