在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).
它不要求逻辑上相邻的元素在物理位置上也相邻.因此它没有顺序存储结构所具有的弱点,但也同时失去了顺序表可随机存取的优点.
链式存储结构
链式存储结构特点:
1、比顺序存储结构的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。
2、逻辑上相邻的节点物理上不必相邻。
3、插入、删除灵活 (不必移动节点,只要改变节点中的指针)。
4、查找结点时链式存储要比顺序存储慢。
5、每个结点是由数据域和指针域组成。
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
以上定义是在经典计算机科学中的解释。
在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址增大,弹出的操作使得栈顶的地址减小。
栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:
1. 函数的返回地址和参数
2. 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
打开IDE
我们创建一个工程
类的声名如下
#if !defined(AFX_LINEARSTACK_H__BE959832_707C_4625_8592_D903D805B2E2__INCLUDED_)
#define AFX_LINEARSTACK_H__BE959832_707C_4625_8592_D903D805B2E2__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//链式堆栈的类定义
const int LEN=40;
typedef struct Stack{
ElemType data;
struct Stack *next;
}StackNode;//结点数据类型
class LinStack
{private:
StackNode *top;//指向栈顶的指针
int size;// 堆栈的结点个数
public:
//构造函数
LinStack();
//初始化栈,分配存储空间并置空
void InitStack(int);
//创建有序或无序栈
void CreateStack(int,int m=LEN,int mark=0);
//返回堆栈的结点个数
int StackSize();
//清空栈
void ClearStack();
//删除栈
void DeleteStack();
//检查栈是否为空
bool StackEmpty();
//读取栈顶元素
ElemType Peek();
//向栈中插入元素
void Push(const ElemType&);
//从栈中删除元素
ElemType Pop();
//检查栈是否已满
bool StackFull(ElemType m=LEN);
//栈的输出
void StackPrint(ElemType m=LEN);
};
#endif // !defined(AFX_LINEARSTACK_H__BE959832_707C_4625_8592_D903D805B2E2__INCLUDED_)
类的实现如下
#include "stdafx.h"
#include "linearStack.h"
// 链式堆栈的实现
#include<stdlib.h>
//构造函数
LinStack::LinStack()
{top=NULL;size=0;}
//初始化栈,分配存储空间并置空
void LinStack::InitStack(int L)
{top=new StackNode[L];
size=0;
}
//创建有序或无序栈
void LinStack::CreateStack(int n,int m,int mark)
{ElemType x,a[LEN/2];
srand(n);
for(int i=0;i<m;i++) a[i]=rand()%100;
for(int i=0;i<m-1;i++)
{int k=i;
for(int j=i+1;j<m;j++)
if(a[k]>a[j]) k=j;
if(k!=i)
{x=a[k];a[k]=a[i];a[i]=x;}}
for(int i=0;i<m;i++)
if(mark==1) Push(a[m-1-i]);//升序
else
if(mark==-1) Push(a[i]);//降序
else Push(rand()%100);//无序
}
int LinStack::StackSize()
{return size;}
//清空栈
void LinStack::ClearStack() {size=0;}
//删除栈
void LinStack::DeleteStack()
{delete top;}
//检查栈是否为空
bool LinStack::StackEmpty() {return size==0;}
//读取栈顶元素
ElemType LinStack::Peek()
{ return top->data;}
//向栈中插入元素
void LinStack::Push(const ElemType& item)
{StackNode *newNode=new StackNode;
newNode->data=item;newNode->next=top;
top=newNode;
size++;
}
//从栈中删除元素
ElemType LinStack::Pop()
{if(size==0) {
cerr<<"栈为空!"<<endl;exit(1);}
StackNode *p=top->next;
ElemType data=top->data;
delete top;
size--;
top=p;
return data;
}
//检查栈是否已满
bool LinStack::StackFull(ElemType m)
{return size==m;}
//栈的输出
void LinStack::StackPrint(ElemType m)
{for(int i=0;i<m;i++)
cout<<setw(3)<<Pop();
}
类的调用如下
#include "stdafx.h"
#include "linearStack.h"
void main()
{cout<<"运行结果:\n";
int m,n;
LinStack q,p,w;
cout<<"输入产生随机数的种子数n:";cin>>n;
cout<<"输入欲构造栈q的长度m:";cin>>m;
cout<<"创建栈q(升序):\n";
q.CreateStack(n,m,1);
cout<<"q栈的结点个数="<<q.StackSize()<<endl;
cout<<"输出q栈元素:\n";
q.StackPrint(m);cout<<endl;
cout<<"q栈:";
if(q.StackFull(m)==1)
cout<<"已满!\n";
else cout<<"未满!\n";
cout<<"创建栈p(降序):\n";
p.CreateStack(n+10,m,-1);
cout<<"p栈:";
if(p.StackFull(m)==1)
cout<<"已满!\n";
else cout<<"未满!\n";
cout<<"删除元素为:"<<p.Pop()<<endl;
cout<<"p栈:";
if(p.StackEmpty()==1)
cout<<"为空!\n";
else cout<<"为非空!\n";
cout<<"输出p栈元素:\n";
p.StackPrint(m-1);cout<<endl;
cout<<"创建栈w(无序):\n";
w.CreateStack(2*n,m);
cout<<"输出w栈元素:\n";
w.StackPrint(m);cout<<endl;
p.ClearStack();
p.DeleteStack();
cin.get();cin.get();
}
效果如下
代码下载
http://download.csdn.net/detail/yincheng01/4788151