顺序栈和链栈的操作实现

目录

一. 前言

二.顺序栈

三. 链栈


一. 前言

        简而言之,顺序栈就是栈的顺序存储,链栈就是栈的链式存储。

二.顺序栈

        下面我们来看下顺序栈的结构定义

typedef char SElemType;
#define MAXSIZE 100
typedef struct{
    SElemType * base;  //栈底指针
    SElemType * top;  //栈顶指针
    int stacksize;   //栈可用的最大容量
}SqStack;

其中的SElemType就表示用户自己所定义的数据类型。 

因为栈都满足后进先出的特点,所以我们一般操作的都是我们的栈顶指针top。当我们的栈顶指针top==栈底指针base的时候,就表示这是个空栈。而当我们的top-base==stacksize的时候,就表示这个栈已经满了,就不能执行如入栈等操作了。

下面我们来看下顺序栈的初始化,如下所示:

int InitStack(SqStack &S){
    S.base=new SElemType[MAXSIZE];    //给栈底分配空间
    if(!S.base) return -1;
    S.top=S.base;                    //初始时,栈顶指针等于栈底指针
    S.stacksize=MAXSIZE;
}

判断顺序栈是否为空栈的算法如下:

int StackEmpty(SqStack S){
    if(S.top==S.base)
        return true;    //栈为空的时候,返回true
    else 
        return false;
}

求顺序栈的长度算法如下:

int StackLength(SqStack S){
    return S.top-S.base;    //栈顶指针减去栈底指针就是元素个数
}

清空顺序栈的算法如下:

int ClearStack(SqStack S){
    if(S.base) S.top=S.base;    //栈为空的条件
    return 1;
}

销毁顺序栈的算法如下:

int DestroyStack(SqStack&S){
    if(S.base){
        delete S.base;
        S.stacksize=0;
        S.base=S.Top=NULL;
    }
    return 1;
}

 顺序栈的入栈:

int Push(SqStack&S,SElemType e){
    if(S.top-S.base==S.stacksize) return -1;    //栈满时,入不了栈
    *S.top++=e;
    return 1;
}

顺序栈的出栈:

int Pop(SqStack&S,SElemType &e){
    if(S.top==S.base)
        return -1;
    e=*--S.top;    //因为top指向有数据的上一位
    return 1;
}

三. 链栈

        链栈是一种特殊的单链表,只能在链表的头部进行操作。

下面我们来看下链栈的结构定义:

typedef struct StackNode{
    SELemType data;
    struct StackNode* next;
}StackNode,*LinkStack;

 链栈的特点如下所示:

下面我们来看下链栈的初始化:

void InitStack(LinkStack&S){
    S=NULL;
    return 1;
}

只需要让链栈指向空指针即可。 

 判断链栈是否为空:

int StackEmpty(LinkStack S){
    if(S==NULL) return true;
    else return false;
}

链栈的入栈:

int Push(LinkStack &S,SElemType e){
    StackNode* p=new StackNode;   //生成新结点p,并分配好空间
    p->data=e;        //将新结点的数据域置为e
    p->next=S;       //将新结点插入栈顶
    S=p;            //修改栈顶指针
    return 1;
}

链栈的出栈:

int Pop(LinkStack&S,SElemType &e){
    if(S=NULL) return -1;
    e=S->data;        //将栈顶的值取出
    StackNode* p=S;        //将此时的栈顶指针保存
    S=S->next;           //取出栈顶的指针后,栈顶的指针需要更改
    delete p;            //释放空间
    return 1;
}

取栈顶元素

SElemType GetTop(LinkStack S){
    if(S!=NULL)
        return S->data;
}

 以上便是我们顺序栈和链栈的所有操作算法。

        

 

 

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值