数据结构之顺序栈

1、顺序栈

1.1、栈的简述

栈(stack)又叫堆栈,它是一种预算受限的线性表,只能在表的一端进行插入和删除运算。栈中允许插入、删除的一端称为栈顶,另一端称为栈底。处于栈顶位置的数据元素称为栈顶元素,向一个栈插入新元素称为进栈、入栈、压栈,从一个栈删除元素又称作出栈或退栈,不含任何元素的栈称为空栈。栈的特点为后进先出(Last In First Out,LIFO)。

日常例子:刷洗盘子、自动步枪上枪膛中的子弹。

1.2、栈的顺序存储结构

    栈的顺序存储用向量作为栈的存储结构,向量S表示栈,m表示栈的大小,用一栈指针top指向栈顶位置S[top]表示栈顶元素,当在栈中进行插入、删除操作时,都要移动栈指针;而当top=m-1,则栈满,当top=-1,表示栈空。

    栈的顺序存储结构的C语言描述

#include <stdio.h>

 

#define StackSize 100/*栈的容量*/

typedef int ElemType;

typedef struct{

               ElemType  data[StackSize];

               int top;

}SqStack;

1.3、顺序栈基本函数算法描述

注:一下程序在VC6.0+WIN2K下测试通过。

1.3.1、初始化

由于C语言的数组下标的范围从0到StackSize-1,初始设置sq.top=-1。

void  InitStack(SqStack *s)

{

    s->top=-1;

}

 

1.3.2、判断一个栈是否为空

栈空条件为-1==sq.top。

int StackEmpty(SqStack s)

{

    if(-1==s.top)

        return 1;

    else

        return 0;

}

1.3.3、压栈

    栈满条件为StackSize-1=sq.top,栈顶元素为sq.data[sq.top]。元素压栈的规则为:在栈不满时,先改变栈顶指针(top=top+1)再压栈,栈中元素的个数为当前栈顶指针加1。

int push(SqStack *s,ElemType e)

{

    if(s->top<StackSize-1)

    {

        s->top=s->top+1;

        s->data[s->top]=e;

        return 1;

    }

    else

    {

        printf("overflow!/n");

        return 0;

    }

}

 

1.3.4、出栈

    在栈非空时,先取栈顶元素的值,再修改栈顶指针(top=top-1)。

int pop(SqStack *s,ElemType *e)

{

    if(-1==s->top)

    {

        printf("underflow/n");

        return 0;

    }

    else

    {

        *e=s->data[s->top];

        (s->top)--;

        return 1;

    }

}

 

1.3.5、取栈顶

int GetTop(SqStack s,ElemType *e)

{

    if (-1==s.top)

    {

        printf("underflow/n");

        return 0;

    }

    else

    {

        *e=s.data[s.top];

        return 1;

    }

}

 

1.3.6、清栈

void ClearStack(SqStack *s)

{

    s->top=-1;

}

1.3.7、显示栈中的所有元素

void ShowStack(SqStack s)

{

    while(!StackEmpty(s))

    {

        printf("栈中元素依次为:%d/n",s.data[s.top]);

        (s.top)--;

    }

}

 

1.3.8、测试程序

int main()

{

    SqStack sq;

    ElemType e;

    InitStack(&sq);

    if(StackEmpty(sq))

        printf("栈空/n");

    ShowStack(sq);

   

    push(&sq,3);

    push(&sq,2);

    push(&sq,1);

    if(StackEmpty(sq))

        printf("栈空/n");

    ShowStack(sq);

   

    pop(&sq,&e);

    printf("出栈元素为%d/n",e);

    ShowStack(sq);

   

    GetTop(sq,&e);

    printf("栈顶元素为%d/n",e);

 

    ClearStack(&sq);

    pop(&sq,&e);

    if(StackEmpty(sq))

        printf("栈空/n");

   

    return 1;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值