数据结构-栈

栈的抽象数据类型定义(ADT):

栈的结构体定义:
ADT Stack{
数据对象:D={ai | ai∈ElemSet , i=1,2,3,4…,n,n≥0}
数据关系:R1={<ai-1,ai> | ai-1,ai∈D,i=2,…,n}
约定an端为栈顶,a1端为栈底
基本操作:
InitStack(&S)
初始条件:
操作结果:
DestoryStack(&S)
初始条件:
操作结果:
ClearStack(&S)
初始条件:
操作结果:
StackEmpty(S)
初始条件:
操作结果:
StackLength(S)
初始条件:
操作结果:
GetTop(S,&e)
初始条件:
操作结果:
Push(&S,e)
初始条件:
操作结果:
Pop(&S,e)
初始条件:
操作结果:
StackTraverse(S,visit())
初始条件:
操作结果:
}ADT Stack

顺序栈(SqStack)

基本操作实现

结构体定义
//顺序栈的存储结构定义
typedef struct LNode {
    ElemType *base,*top;
    int stacksize;
} SqStack;
构造一个空栈
//InitStack构造一个空栈S
Status InitStack(SqStack &S)
{
    // TODO (#1#): 构造一个空栈S,不带头结点
    S.base=(ElemType *)malloc(STACK_H_INCLUDED*sizeof(ElemType));
    if(S.base==NULL)return ERROR;
    S.top=S.base;
    S.stacksize=STACK_H_INCLUDED;//栈的容量
    return OK;
    //-------------------------------------
}
StackEmpty判断栈空
//若栈S为空返回TRUE,否则FALSE
Status StackEmpty(SqStack S)
{
    // TODO (#1#): 若栈S为空返回TRUE,否则FALSE
        if(S.top==S.base)return TRUE;
        return ERROR;
    //-------------------------------------
}
StackLength返回栈S中的元素个数
//返回栈S中的元素个数
int StackLength(SqStack S)
{
    // TODO (#1#): 返回栈S中的元素个数

    return S.top-S.base;
    //-------------------------------------
}
GetTop返回栈顶元素
//用e返回栈顶元素
//    前提:栈S存在且不空
Status GetTop(SqStack S, ElemType &e)
{
    // TODO (#1#):若栈S不空,则用e返回栈顶元素
    if(S.top!=S.base)
        e=*(S.top-1);
         return OK;

    //-------------------------------------
}
Push入栈
//元素e入栈S
Status Push(SqStack &S, ElemType e)
{
    // TODO (#1#): 插入元素e作为新的栈顶
    if(S.top-S.base<S.stacksize)
        *S.top=e;
        S.top++;
    return OK;
    //-------------------------------------
}
Pop出栈
//S出栈用e返回出栈元素
//    前提:栈S存在且不空
Status Pop(SqStack &S, ElemType &e)
{
    // TODO (#1#):若栈S不空,则删除栈顶元素用e返回
    if(S.top==NULL)return ERROR;
    S.top--;
    e=*S.top;
    return OK;
    //-------------------------------------
}

链栈(LinkStack)

基本操作实现

链栈的存储结构定义
//链栈的存储结构定义
typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode, *LinkStack;
InitStack初始化空栈
//构造一个空栈S
Status InitStack(LinkStack &S)
{
    // TODO (#1#): 构造一个空栈S,不带头结点
    S=NULL;
    return OK;
    //-------------------------------------
}
StackEmpty判断栈空
//若栈S为空返回TRUE,否则FALSE
Status StackEmpty(LinkStack S)
{
    // TODO (#1#): 若栈S为空返回TRUE,否则FALSE
    if(S==NULL)
    {
        return TRUE;
    }else{
    return FALSE;
    }
    //-------------------------------------
}
StackLength返回栈S中的元素个数
//返回栈S中的元素个数
int StackLength(LinkStack S)
{
    // TODO (#1#): 返回栈S中的元素个数
    LinkStack L;
    L=S;
    int j=0;
    while(L){
        L=L->next;
        j++;
    }
    return j;
    //-------------------------------------
}
GetTop取栈顶
//用e返回栈顶元素
//    前提:栈S存在且不空
Status GetTop(LinkStack S, ElemType &e)
{
    // TODO (#1#):若栈S不空,则用e返回栈顶元素
    if(S==NULL)
    {
        return ERROR;
    }else{
        e= S->data;
    }


    //-------------------------------------
}
Push入栈
//元素e入栈S
Status Push(LinkStack &S, ElemType e)
{
    // TODO (#1#): 插入元素e作为新的栈顶
    LinkStack T;
    T=(LinkStack)malloc(sizeof(LNode));
    if(!T)return ERROR;
    T->data=e;T->next=NULL;
    T->next=S;S=T;
    return OK;
    //-------------------------------------
}
Pop出栈
//S出栈用e返回出栈元素
//    前提:栈S存在且不空
Status Pop(LinkStack &S, ElemType &e)
{
    // TODO (#1#):若栈S不空,则删除栈顶元素用e返回
    LinkStack T;
    T=S;
    S=T->next;
    e=T->data;
    free(T);
    return OK;
    //-------------------------------------
}

栈的应用举例

数制转换

括号匹配

迷宫求解

表达式求值

行编辑程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值