数据结构 - 栈

来源:互联网 发布:炉石传说卡牌数据库 编辑:程序博客网 时间:2024/06/05 01:51

栈的概述

什么是栈呢?

限定仅在表尾进行插入或删除操作的线性表。对栈来说,表尾又称栈顶(top),表头又称为栈底(bottom)。不含元素的空表称为空栈。
如:栈S=(a1,a2,…,an),其中a1为栈底元素,an 为栈顶元素

栈有什么特点呢?

栈是一种线性结构
对栈的操作按照“后进先出”的原则进行

读栈顶元素

非空栈中,读取栈顶元素,不影响栈中元素之间的关系
这里写图片描述

入栈

向栈中插入一个新的元素,新插入的元素为新的栈顶元素
这里写图片描述

出栈

非空栈中,删除栈顶元素,其直接前驱为新的栈顶元素
这里写图片描述

栈的存储与实现

  • 顺序栈
    用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,栈顶指针为指向表尾的指针

  • 链栈
    利用链表存储栈中栈底到栈顶的数据元素,栈顶指针为链表头指针

顺序栈算法

#define STACK_INIT_SIZE  100  #define  STACKINCREMENT 10   typedef struct {  SElemType  *base;      SElemType  *top;    int   stacksize;      } SqStack;

顺序栈的基本形态

这里写图片描述 这里写图片描述

在顺序栈中,栈底指针始终指向栈底位置,而在非空栈中,栈顶指针始终指向栈顶元素的下一个位置

初始化(空栈)

S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));S.top = S.base;S.stacksize = STACK_INIT_SIZE;

顺序栈的入栈算法

if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间    S.base = (SElemType *) realloc ( S.base,    (S.stacksize + STACKINCREMENT) *sizeof (SElemType));                                                       sizeof (SElemType));    S.top = S.base + S.stacksize;        S.stacksize += STACKINCREMENT;}*S.top = e; S.top = S.top+1;

顺序栈的入栈算法

if (S.top != S.base) {    S.top = S.top-1;   *S.top = e;}

链栈(栈的链式存储结构)

链栈的算法

typedef struct SNode{     SElemType data;     //数据域     structLNode *next;  //指针域}SNode, *LinkStack;

这里写图片描述

  • 链栈的基本操作实现:

链栈中进行入栈、出栈和取栈顶元素等基本操作时,相当于链表在头指针处进行相应操作

入栈:插入在链表中的第一个位置,头指针指向新插入的元素

出栈:删除链表的第一元素,头指针指向其后继

取栈顶:读取链表中第一个元素,头指针不变

0 0
原创粉丝点击