这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战
第3 章 栈和队列
栈
3.1.1 栈的定义和特点
- 定义 只能在表的一端(栈顶)进行插入和删除运算的线性表
- 逻辑结构 与线性表相同,仍为一对一关系
- 存储结构 用顺序栈或链栈存储均可,但以顺序栈更常见
- 运算规则 只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出 (FILO)的原则
- 主要操作 入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同 基本操作有入栈、出栈、读栈顶元素值、建栈、判断栈满、栈空等
3.1.2 栈的表示和操作实现
“进”=压入=PUSH() “出”=弹出=POP( )
顺序栈的表示
- top 指示真正的栈顶元素之上的下标地址栈满时的处理方法: 1、报错,返回操作系统。 2、分配更大的空间,作为栈的存储空间,将原栈的内容移入新栈。
//第一种存储结构:顺序栈的表示
#define MAXSIZE 100
typedef struct
{
SElemType *base; SElemType *top;
int stacksize;
}SqStack;
操作1:顺序栈初始化(构造一个空栈)
【算法步骤】 (1)分配空间并检查空间是否分配失败,若失败则返回错误 (2)设置栈底和栈顶指针 S.top = S.base; (3)设置栈大小
//【算法描述】顺序栈初始化
Status InitStack( SqStack &S )
{
S.base =new SElemType[MAXSIZE]; if( !S.base ) return OVERFLOW; S.top = S.base;
S.stackSize = MAXSIZE;
return OK;
}
操作 2:判断顺序栈是否为空
【算法步骤】 判断顶与底两个指针是否相等 【算法描述】判断顺序栈是否为空
bool StackEmpty( SqStack S )
{
if(S.top == S.base) return true; else return false;
}
操作 3:求顺序栈的长度
【算法描述】求顺序栈的长度
int StackLength( SqStack S )
{
return S.top – S.base;
}
操作4:清空顺序栈
【算法步骤】 让栈顶和栈底有相同指向,都指向栈底 【算法描述】清空顺序栈
Status ClearStack( SqStack S )
{
if( S.base ) S.top = S.base;
return OK;
}
操作 5:销毁顺序栈
【算法步骤】 (1)释放所有内存空间 (2)顺序栈的三个成员变量要置零 销毁顺序栈
Status DestroyStack( SqStack &S ){
if( S.base )
{
delete S.base ;
S.stacksize = 0;
S.base = S.top = NULL;
}
return OK;
}
操作 6: 顺序栈进栈
【算法步骤】 (1)判断是否栈满,若满则出错 top (2)元素e 压入栈顶 (3)栈顶指针加 1 【算法描述】顺序栈进栈
Status Push( SqStack &S, SElemType e)
{
if( S.top - S.base== S.stacksize ) // 栈满
return ERROR;
*S.top++=e;
return OK;
}
操作7: 顺序栈出栈
【算法步骤】 (1)判断是否栈空,若空则出错 (2)获取栈顶元素 e (3)栈顶指针减 1 【算法描述】顺序栈出栈
Status Pop( SqStack &S, SElemType &e)
{
if( S.top == S.base ) // 栈空
return ERROR;
e= *--S.top;
return OK;
}
操作8: 取顺序栈栈顶元素
【算法步骤】 (1) 判断是否空栈,若空则返回错误 (2) 否则通过栈顶指针获取栈顶元素 【算法描述】取顺序栈栈顶元素
Status GetTop( SqStack S, SElemType &e)
{
if( S.top == S.base ) return ERROR; // 栈空 e = *( S.top – 1 );
return OK;
}
栈与递归
- 递归的定义 若一个对象部分地包含它自己,或用 它自己给自己定义,则称这个对象是递归的;若一个过程直接地或间接地调用自己, 则称这个过程是递归的过程。
- 求解递归问题方法
- 分治法:对于一个较为复杂的问题,能够分解成几个相对简单的且解法相同或类似的子问题来求解必备的三个条件
- (1)能将一个问题转变成一个新问题,而新问题与原问题的解法相同或类同,不同的仅是处理的对象,且这些处理对象是变化有规律的
- (2)可以通过上述转化而使问题简化
- (3)必须有一个明确的递归出口,或称递归的边界
栈和队列的定义和特点
- 定义只能在表的一端(队尾)进行插入,在另一端(队头)进行删除运算的线性表
- 逻辑结构 与线性表相同,仍为一对一关系
- 存储结构用顺序队列或链队存储均可 4.运算规则 先进先出(FIFO) 5.主要操作入队和出队函数,具体实现依顺序队或链队的不同而不同 栈、队列与一般线性表的区别栈、队列是一种特殊(操作受限)的线性表
区别:仅在于运算规则不同
- 一般线性表 逻辑结构:一对一 存储结构:顺序表、链表 运算规则:随机、顺序存取
- 队列
逻辑结构:一对一
存储结构:顺序队、链队
运算规则:先进先出 - 栈 逻辑结构:一对一 存储结构:顺序栈、链栈 运算规则:后进先出