数据的存储结构(物理结构):数据结构在计算机中的表示(又称映像)
数据:符号表示(人类)。
数据元素:基本单位(人)。
线性结构:一个数据元素的有序集合,元素与元素之间存在一对一的关系。
非线性结构:元素与元素之间存在一对多的关系。
栈和队列是线性结构,是抽象数据类型。
栈的抽象数据类型的定义如下:
ADT Stack{
数据对象:(性质相同的数据元素的集合,是数据的一个子集) { 15移动1班的所有学生 }
数据关系:(数据元素之间的逻辑关系、逻辑结构) 学号大小
基本操作:(构造一个空栈 S )void InitStack(&S)
(销毁栈)DestroyStack(&S)
(清空栈)ClearStack(&S)
(判断空不空)StackEmpty(S)
(返回栈长度)StackLength(S)
(用 e 返回栈顶元素)GetTop(S,&e)
(插入元素e)Push(&S,e)
(删除栈顶)Pop(&S,&e)
(从栈底到栈顶,依次对每个元素调用函数visit())StackTraverse(S,visit())
}
栈有两种存储表示方法:
(1)顺序栈(利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,指针top始终在栈顶元素的下一个位置上)
定义:
#define STACK_INCREMENT 10;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
注:SElemType意思是栈的数据元素的类型,stacksize为栈的当前可使用的最大空间容量。
优点:可在应用的过程中,当栈的容量不够用时,再stacksize加上常量STACK_INCREMENT,以逐步扩大。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//插入栈顶元素的代码如下:
int Push(SqStack &S,SElemType e){
//如果栈满,追加存储空间。
if(S.top-S.base > = S.stacksize){
S.base = (SElemType *) realloc ( S.base , (S.stacksize+STACK_INCREMENT )*sizeof(SElemType) );
if( ! S.base )
exit(OVERFLOW); //如果存储分配失败,退出该方法,并返回OVERFLOW的值给主调进程。
S.stacksize + = STACK_INCREMENT;
}
//将e值赋给 top 所指的元素*top,top再加一
*top ++ = e ;
return OK;
}
注:(1)exit为C++的退出函数,声明于stdlib.h中,对于C++其标准的头文件为cstdlib,声明为 void exit(int value);
exit的功能为,退出当前运行的程序,并将参数value返回给主调进程。
(2)OVERFLOW为math.h中的一个宏定义,其值为3。含义为运算过程中出现了上溢,即运算结果超出了运算变量所能存储的范围。
(3)realloc(旧的首地址,位大小),返回 新的存储空间的 首地址。
(4)根据 优先级(前缀>中缀>后缀), *top ++ = e 可分为两个代码段:*top = e 和 top++ 。
//删除并取出栈顶元素的值,代码如下:
int Pop(qStack &S,SElemType &e){
if(S.top==S.base)
return ERROR;
e = * - - S.top; //如果栈不为空,通过top =top-1操作,以删除栈顶元素,再将top所指元素的值 赋予 e 。
return OK;
}
(2)链栈