数据结构学习小结(5)——堆栈的顺序存储

后缀表达式

中缀表达式:运算符号位于两个运算数之间
后缀表达式:运算符号位于两个运算数之后
后缀表达式求值策略:从左向右“扫描”,逐个处理运算数和运算符号
遇到运算数后先“记住”运算的数,不进行运算,遇到运算符号后,把最近记住的两个运算数进行运算
因此,在使用过程中需要有种存储方法,能顺序存储运算数并在需要时“倒序”输出——也就是堆栈

堆栈

堆栈(Sk):具有一定操作约束的线性表
只在一端(栈顶,Top)做插入、删除
插入数据:入栈(Push)
删除数据:出栈(Pop)
后入先出:Last In First Out(LIFO)

堆栈的抽象数据类型描述

类型名称:堆钱(Stek)
敷据对象集:一个有个或多个元素的有穷线性表。
操作集:长度为MaxSize的堆栈S ∈ Stack,堆栈元素item ∈ElementType
I、Stack CreateStack(int MaxSize):生成空堆栈,其最大长度为MaxSize:
2、int IsFull(Stack S,int MaxSize:判断堆栈s是否己满:
3、void Push(Stack S,ElementType item:将元素item压入堆栈:
4、int1 sEmpty(Stack S):判断堆找s是否为空:
5、ElementType Pop(Stack S):删除并返回栈顶元素:

栈的顺序存储实现

栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。

一个堆栈

#define MaxSize<储存数据元素的最大个数>
typedef struct SNode *Stack;
struct SNodef
{
ElementType Data[MaxSize];
int Top;
}
(1)入栈
void Push(Stack PtrS,ElementType item)
{
if (PtrS->Top =MaxSize-1 )
printf("堆栈满")return:
}
else
{
PtrS->Data[++(PtrS->Top)]=item:
return;
}
}
(2)出栈
ElementType Pop(Stack PtrS)
{
if (PtrS->Top ==-1)
{
printf(“堆栈空")return ERROR;
}
else
return (PtrS->Data[(PtrS->Top)--]);
}

两个堆栈

#define MaxSize<存储数据元素的最大个数>
struct DStack
ElementType Data[MaxSize];
int Top1;
int Top2;
}S;
S.Top1=-1;
S.Top2 MaxSize;
(1)入栈
void Push(struct DStack *ptrs,ElementType item,int Tag
{
if(PtrS->Top2-PtrS->Top1=1){
printf("堆栈满")return}
if(Tag==1)
PtrS->Data[++(PtrS->Top1)]=item;
else
PtrS->Data[--(ptrS->Top2)]item;
}
(2)出栈
ElementType Pop(struct DStack *ptrs,int Tag)
{
if(Tag=1){
if(PtrS->Top1=-1)
{
printf("堆栈l空")return NULL;
}
else return PtrS->Data[(PtrS->Topl)--];
}
else
{
if(PtrS->Top2=MaxSize)
{
printf("堆栈2空")return NULL;
else return ptrS->Data[(PtrS->Top2)++];
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值