顺序栈的算法

目录

一、顺序栈的存储方式和相关概念

二、定义顺序栈的数据类型

三、判断顺序栈是否为空栈

四、求顺序栈长度

五、清空顺序栈

六、销毁顺序栈

七、顺序栈的初始化

八、顺序栈入栈

九、顺序栈的出栈


一、顺序栈的存储方式和相关概念

1、存储方式:同一般线性表的顺序存储结构完全相同,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,栈底一般在低地址端。

2、相关概念

①附设top指针,指向栈顶元素在顺序栈中的位置。为了方便操作,通常top指示真正的

栈顶元素之上的下标地址。

②另设base指针,指向栈底元素在顺序栈中的位置。

③另外,用stacksize表示栈可使用的最大容量 。结构图如下图所示:

3、空栈和栈满的条件

①空栈:base==top是栈空标志。

②栈满:top-base=stacksize是栈满标志。

二、定义顺序栈的数据类型

#define MAXSIZE 100       //顺序栈存储空间的初始分配量

typedef struct{          //这里的typedef是C语言的关键字,作用为是一种数据类型定义一个新名字。这里 
                           是定义struct数据类型。

SElemType *base;         //栈底指针

SElemType *top;          //栈顶指针

int stacksize;          //栈可用的最大容量

}SqStack;

三、判断顺序栈是否为空栈

Status StackEmpty(SqStack S){

//若栈为空,返回TRUE;否则返回FALSE

if (S.top==S.base)

return TRUE;
else
return FALSE;

}

四、求顺序栈长度

int StackLength(SqStack S)
{

return S.top-S.base;

}

五、清空顺序栈

Status ClearStack(SqStackS){

if( S.base ) S.top = S.base;
return OK;
}

六、销毁顺序栈

Status DestroyStack( SqStack &S){
if(S.base){

delete S.base;

S.stacksize=0;

S.base=S.top=NULL;
}

return OK;

}

七、顺序栈的初始化

Status InitStack(SqStack &S){ //构造一个空栈

S.base = new SElemType[MAXSIZE];  //或S.base=(SElemType*)malloc(MAXSIZE*sizeof(SElemType))

if (!S.base) exit (OVERFLOW); //存储分配失败

S.top=S.base; //栈顶指针等 于栈底指针

S.stacksize = MAXSIZE;
return OK;
}

八、顺序栈入栈

1、算法思路:

(1)判断是否栈满,若满则出错(上溢)

(2)元素e压入栈顶

(3)栈顶指针加1

2、算法描述

Status Push( SqStack &S, SElemType e) {

if( S.top-S.base==S.stacksize )//栈满

return ERROR;
                 
*S.top=e;
                     //*S.top++=e
S.top++; 
return OK;
}

九、顺序栈的出栈

1、算法思路

(1)判断是否栈空,若空则出错(下溢)

(2)获取栈顶元素e

(3)栈顶指针减1

2、算法描述

Status Pop(SqStack &S, SElemType &e) {

//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR

if(S.top==S.base) // 等价于if(StackEmpty(S))
return ERROR;

--S.top;
                   //e=*--S.top; 
e=*S.top;
return OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜深人静码代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值