栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
以上定义是在经典计算机科学中的解释。
在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址增大,弹出的操作使得栈顶的地址减小。
栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:
1. 函数的返回地址和参数
2. 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。 学过编译原理的人都知道解析任意计算表达式不是个轻松的活 我们来用堆栈实际解决解析任意计算表达式 打开IDE
我们基于VC++2012创建一个工程
类代码如下
[cpp] view plaincopy
- #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;}
- }
调用代码如下
[cpp] view plaincopy
- 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();
- }
效果如下
|