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