数据结构入门学习系列-7(栈的结构以及存储方式和算法)
来源:互联网 发布:nodejs数据库前端显示 编辑:程序博客网 时间:2024/06/14 07:01
本章来讲一下线性表的特殊结构之一:栈
栈是只能在表的一段进行插入和删除的线性结构,所有具有后进先出的特点。
栈顶:top端,允许插入删除,表尾。
栈尾:bottom端,固定端,表头。如下图所示:
栈结构分为三种存储方式:动态数组存储,静态数组存储,链表存储
动态一维数组方式如下图:
1.用bottom表示栈底指针,bottom是不变的;top表示栈顶指针表示当前栈顶位置,进行出栈操作和入栈操作。
2.用top=bottom表示栈空,top每次指向栈顶的下一个存储位置。
3.进栈:首先将元素保存到top指向当前位置,然后top+1,指向下一个存储位置。
4.出栈:top-1,然后取出top位置的元素。
具体参照代码:
//stack动态数组存储#define STACK_SIZE 100#define STACKINCREMENT 10typedef int ElemType;typedef struct _SqStack{ ElemType *top; ElemType *bottom; int stacksize;}SqStack;BOOL Init_Stack(void){ SqStack S; S.bottom = (ElemType *)malloc(STACK_SIZE*sizeof(ElemType)); if(!S.bottom) return FALSE; S.top = S.Bottom; S.stacksize = STACK_SIZE; return OK;}BOOL Stack_Push(SqStack S, ElemType e){ if(S.top - S.bottom > STACK_SIZE-1) { S.bottom = (ElemType *)realloc((STACK_SIZE+STACKINCREMENT)*sizeof(ElemType)); if(!S.bottom) return ERROR; S.top = S.bottom + S.stacksize; S.stacksize = STACKINCREMENT+STACK_SIZE; } *S.top = e; s.top++; return OK;}BOOL Stack_Pop(SqStack S, ElemType *e){ if(S.top == S.bottom) return ERROR; S.top--; *e = *S.top; return OK;}
静态一维数组存储方式:
1.栈底bottom保持不变,栈顶top使用一个int型变量指示当前的栈顶位置。
2.栈顶top=0表示栈空,top表示栈顶在数组中的存储位置
3.进栈:top+1指向新的位置,然后top中存储进栈元素
4.出栈:取出top中的元素,top-1
//stack的静态数组存储方式#define MAX_STACK_SIZE 100typedef int ElemType;typedef struct _SqSize{ ElemType stack_array[MAX_STACK_SIZE]; int top;}SqStack;//栈的初始化SqStack Init_Stack(void){ SqStack S; S.top = 0; return S;}//栈的进栈BOOL Stack_Push(SqStack S,ElemType e){ if(S.top = MAX_STACK_SIZE-1) return FALSE; S.top++; S.stack_array[S.top] = e; return OK;}//栈的出栈Bool Stack_Pop(SqStack S, ElemType *e){ if(S.top = 0) return ERROR; *e=S.stack_array[S.top]; S.top--; return OK;}
链式存储方式:
该链表只能在链表的头部进行插入和删除的操作,链表头指针就是top指针。
//stack的链式存储#typedef int ElemType;typedef struct Stack_Node{ ElemType data; struct Stack_Node *next;}Stack_Node;//初始化Stack_Node *Init_stack(void){ Stack_Node *top; top = (Stack_Node *)malloc(sizeof(Stack_Node)); top->next = NULL; return top;}//压栈操作,pushBOOL push(Stack_Node *top, ElemType e){ Stack_Node *p; p = (Stack_Node*)malloc(sizeof(Stack_Node)); if(!p) return ERROR; p->next = top->next; top->next = p; return OK;}//出栈操作BOOL pop(Stack_Node *top, ElemType *e){ Stack_Node *p; if(top->next == NULL) return ERROR; p=top->next; p->data = *e;//取栈顶指数据 p->next = top->next;//移动栈顶指针 free(p); return OK;}
阅读全文
0 0
- 数据结构入门学习系列-7(栈的结构以及存储方式和算法)
- 《数据结构和算法》之栈的链式存储结构
- 数据结构入门学习系列-2(算法的时间复杂度)
- 数据结构与算法(Java描述)-11、串的基本概念以及串存储结构
- 数据结构之 图的存储结构和遍历方式
- 树的存储结构 – 数据结构和算法41
- 树的存储结构2 – 数据结构和算法42
- 二叉树的存储结构 – 数据结构和算法45
- 《数据结构和算法》之队列的顺序存储结构
- 数据结构-二叉树的存储结构和遍历算法(四)
- 数据结构入门学习系列-3(线性表的顺序存储)
- 数据结构入门学习系列-4(线性表的链式存储)
- 算法系列(七)数据结构之树的基本结构和二叉树的遍历
- 数据结构与算法系列-树-二叉树存储结构
- 数据结构算法中用到的存储结构
- 数据结构入门学习系列-8(栈的经典算法用例)
- 数据结构入门学习系列-5(链表的基本操作算法)
- 数据结构与算法系列-串-串的基本概念与存储结构
- 关于前端跨域 一次动作 两次请求的问题
- 算法思想之牛逼的DP
- java基础之IO与NIO
- Android WiFi 经常掉线出现的几个原因分析!
- oracle 锁住的数据删除 方法 -留着自己看
- 数据结构入门学习系列-7(栈的结构以及存储方式和算法)
- 1.3简要介绍Hibernate实现原理
- zookeeper
- 人性的弱点
- leetcode 118|119. Pascal's Triangle 1|2
- unity做类似QQ截图功能
- linux centos 让man命令帮助显示简体中文
- Message(Message Pool)源码分析
- android 之 高德地图-定位-poi-marker