栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(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(); }
效果如下
代码下载地址