队列
队列只允许
在表的一端进行插入,而在另一端删除元素
。允许插入的一端称为队尾,允许删除的一端称为队头。
- 特点:先进先出的线性表
栈
栈是限定
仅在表尾
进行插入或删除操作的线性表。表尾端称为栈顶,表头端称为栈底,不含元素的空表称为空栈。
`栈有两种存储方式,分别为顺序栈和链栈
- 特点:后进先出的线性表
栈的类型定义
-
InitStack(&S)
构造一个空栈S -
在栈S已存在的情况下
-
DestroyStack(&S)
销毁栈S -
ClearStack(&S)
将S清为空栈 -
StackEmpty(S)
若栈S为空栈,则返回true,否则返回false -
StackLength(S)
返回S的元素个数,即栈的长度 -
GetTop(S)
(S为非空)返回S的栈顶元素,不修改栈顶指针 -
Push(&S,e)
插入元素e为新的栈顶元素 -
Pop(&S,&e)
(S为非空)删除S的栈顶元素,并用e返回其值 -
StackTraverse(S)
(S为非空)从栈底到栈顶依次对S的每个数据元素进行访问
顺序栈
顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,指针base指示栈底元素在顺序栈中的位置。
当top和base的值相等或top=0时,表示空栈
define MAXSIZE 100 //顺序栈存储空间的初始分配量
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用的最大容量
}SqStack;
(初始化完成后,栈底指针base始终指向栈底的位置,若base的值为NULL,则表明栈结构不存在。
栈空时,top和base的值相等,都指向栈底;栈非空时,top始终指向栈顶元素的上一个位置。
)
栈中元素和栈指针之间的关系:
部分操作的实现:
- 初始化
顺序表初始化是为顺序栈动态分配一个预定义大小的数组空间
Status InitStack(SqStack &S)
{ //构造空栈S
S.base=new SElemType[MAXSIZE]; //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!S.base) exit(OVERFLOW); //存储分配失败
S.top=S.base; //空栈
S.stacksize=MAXIZE; //stcksize置为栈的最大容量MAXSIZE
return OK;
}
- 入栈
入栈是在栈顶插入一个新元素
Status Push(SqStack &S,SElemType e)
{ //插入元素e为新的栈顶元素
if(S.top-S.base==S.stacksize) return ERROR;//栈满
*S.top++=e; //元素e压入栈顶,栈顶指针加1
return OK;
}
- 出栈
出栈是删除栈顶元素
Status Pop(SqStack &S,SElemType &e)
{ //删除S的栈顶元素,用e返回其值
if(S.top==S.base) return ERROR; //栈空
e=*--S.top; //栈顶指针减1,将栈顶元素赋给e
return OK;
}
- 取栈顶元素
当栈非空时,此操作返回当前栈顶元素的值,栈顶指针保持不变
SElemType GetTop(SqStack S)
{ //返回S的栈顶元素,不修改栈顶指针
if(S.top!=S.base) //栈非空
return *(S.top-1); //返回栈顶元素的值,栈顶指针不变
}
在应用程序无法先估计栈可能达到的最大容量时,应该使用链栈
链栈
链栈是采用链式存储结构实现的栈。通常链栈用单链表来表示。
链栈示意图:
部分操作的实现:
- 初始化
链表初始化是构造一个空栈。因为没必要设头结点,所以直接将栈顶指针置空即可
Status InitStack(LinkStack &S)
{ //构造空栈S,栈顶指针置空
S=NULL;
return OK;
}
- 入栈
和顺序栈的入栈操作不同的是,
链栈在入栈前不需要判断栈是否满,只需要为入栈元素动态分配一个结点空间
链栈入栈过程:
Status Push(LinkStack &S, SElemType e)
{ //在栈顶插入元素e
p=new StackNode; //生成新结点
p->data=e; //将新结点数据域置为e
p->next=S; //将新结点插入栈顶
S=p; //修改栈顶指针为p
return OK;
}
- 出栈
和顺序栈一样,链栈在出栈前也需要判断栈是否为空,
不同的是,链栈在出栈后需要释放出栈元素的栈顶空间
链栈出栈过程:
Status Pop(LinkStack &S,SElemType &e)
{ //删除S的栈顶元素,用e返回其值
if(S==NULL) return ERROR; //栈空
e=S->data; //将栈顶元素赋给e
p=S; //用p临时保存栈顶元素空间,以备释放
S=S->next; //修改栈顶指针
delete p; //释放原栈顶元素的空间
return OK;
}
- 取栈顶元素
和顺序栈一样,当栈非空时,此操作返回当前栈顶元素的值,栈顶指针S保持不变
SElemType GetTop(LinkStack S)
{ //返回S的栈顶元素,不修改栈顶指针
if(S!=NULL) //栈非空
return S->data; //返回栈顶元素的值,栈顶指针不变
}