一、栈和队列的定义和特点
- 栈和队列是两种常用的、重要的数据结构
- 栈和队列是限定插入和删除只能在表的“端点”进行的线性表
- 栈和队列是线性表的子集(是插入和删除位置受限的线性表)
栈——先进后出、后进先出
队列——先进先出
二、栈的定义和特点
- 栈(stack)是一个特殊的线性表,是限定仅在一端(通常是表尾)进行插入和删除操作的线性表
- 又称为后进先出的线性表,简称LIFO结构
- 表尾(即an端)称为栈顶Top;表头(即a1端)称为栈底Base
- 插入元素到栈顶(即表尾)的操作,称为入栈
- 从栈顶(即表尾)删除最后一个元素的操作,称为出栈
- “入”=PUSH(x) “出”=POP(y)
三、队列的定义和特点
- 队列(queue)是一种先进先出(FIFO)的线性表。在表一端插入(表尾),在另一端(表头)删除
- 逻辑结构:与同线性表相同,仍为一对一关系
- 存储结构:顺序队或链队,以循环顺序队列更常见
四、栈的表示和操作的实现
-
空栈:base==top 是栈空标志
-
栈满:top-base==stacksize
-
栈满时的处理方法
- 报错,返回操作系统
- 分配更大的空间,作为栈的存储空间,将原栈的内容移入新栈
-
使用数组作为顺序栈存储方式的特点:
-
简单,方便,单易产生溢出(数组大小固定)
- 上溢(overflow):栈已经满,又要压入元素
- 下溢(underflow):栈已经空,还要弹出元素
注:上溢是一种错误,使问题的处理无法进行;而下溢一般认为是一种结束条件,即问题处理结束
-
1、栈的初始化
void InitStack(SeqStack *S)
{
S->top=-1;
}
2、判断栈空
int IsEmpty(SeqStack S)
{
if(S.top==-1)
return TRUE;
else
return FALSE;
}
3、判断栈满
int IsFULL(SeqStack S)
{
if(S.top==StackSize-1)
return TRUE;
else
return FALSE;
}
4、求顺序栈长度
int StackLength(SeqStack S)
{
return S.top-S.base;
}
5、清空栈
int ClearStack(SeqStack S)
{
if(S.base)
S.top=S.base;
return OK;
}
6、销毁栈
int DestryStack(SeqStack &S)
{
if(S->base)
{
delete S.base;
S.stacksize=0;
S.base=S.top=NULL;
}
return OK;
}
7、入栈
int