数据结构:栈的顺序存储
来源:互联网 发布:jenkins php svn 编辑:程序博客网 时间:2024/06/05 20:31
一. 栈的概念
栈为一种可以实现“先进后出”的存储结构,凡是对数据的处理具有“后进先出(LIFO)”的特点,都可以用栈这种数据结构来操作。
栈也是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的受限线性表而已。
栈的特殊之处在于限制了这个线性表的插入和删除的位置,它始终只在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。
二 . 栈操作
栈的插入操作,叫做进栈,也成压栈。类似子弹入弹夹。
栈的删除操作,叫做出栈,也有的叫做弾栈,退栈。如同弹夹中的子弹出夹。
三. 栈的顺序存储
栈的顺序存储结构简称顺序栈,它是运算受限制的顺序表。顺序栈的存储结构是:利用一组地址连续的的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top只是栈顶元素在顺序表中的位置。
/**** SeqStack.h ****//******************************************//**** 初始化一个栈 ****//**** 压栈(入栈)操作 ****//**** 出栈(弹栈) ****//**** 销毁栈 ****//**** 返回栈顶元素 ****//**** 输出栈的元素个数 ****//**** 判断栈是否为空 ****//**** 求栈的长度 ****//******************************************/#pragma once#include <stdio.h>#include <stdlib.h>#define MAXSIZE 1024#define true 1#define false 0typedef int ElemTyPE;typedef struct Stack { /****结构体套一级指针****/ ElemTyPE *base; int StackSize; int top; }SeqStack;/**** 初始化一个栈 ****/void CreateStack(SeqStack *stack);/**** 压栈(入栈)操作 ****/int PushStack(SeqStack *stack,ElemTyPE data);/**** 出栈(弹栈) ****/int PopStack(SeqStack *stack,ElemTyPE *mPtr);/**** 销毁栈 ****/int DestoryStack(SeqStack *stack);/**** 返回栈顶元素 ****/void GetTopStack(SeqStack *stack,ElemTyPE *mPtr);/**** 输出栈的元素个数 ****/void ListStack(SeqStack *stack);/****判断栈是否为空****/int EmptyStack(SeqStack *stack);/****求栈的长度****/int GetLenStack(SeqStack *stack);/**** SeqStack.c ****/#include "SeqStack.h"/**** 初始化一个栈 ****/void CreateStack(SeqStack *stack) { /**** 分配MAXSIZE个SeqStack变量 ****/ stack->base = (ElemTyPE *)malloc (sizeof(ElemTyPE)*MAXSIZE); stack->top = 0; stack->StackSize = MAXSIZE; }/**** 压栈(入栈)操作 ****/int PushStack(SeqStack *stack,ElemTyPE data) { /**** 栈满,增加一个存储空间 ****/ if (stack->top >= stack->StackSize) { stack->base = (ElemTyPE *)realloc (stack->base,sizeof(ElemTyPE)*(stack->StackSize+1)); if (!stack->base) { return false; } stack->StackSize++; } /**** 插入元素,同时栈顶指针上移 ****/ stack->base[stack->top++]=data; return true; }/**** 出栈(弹栈) ****/int PopStack(SeqStack *stack,ElemTyPE *mPtr) { if (stack == NULL) { return false; } *mPtr = stack->base[stack->top--]; return true; }/**** 销毁栈 ****/int DestoryStack(SeqStack *stack) { if (stack == NULL) { return true; } else { free (stack); stack = NULL; } return true; }/**** 遍历栈 ****/void ListStack(SeqStack *stack) { int i; /**** 若栈为NULL,直接结束 ****/ for (i=stack->top-1;i>=0;i--) { printf ("%2d",stack->base[i]); } printf ("\n"); }/**** 返回栈顶元素 ****/void GetTopStack(SeqStack *stack,ElemTyPE *mPtr) { if (stack == NULL) { return; } /**** 注意栈顶元素的下标 stack->base[stack->top-1] ****/ *mPtr = stack->base[stack->top-1]; //printf ("top data:%d\n",*mPtr); return; }/**** 判断栈是否为空 ****/int EmptyStack(SeqStack *stack) { /**** 若栈顶元素为0,说明栈为NULL ****/ if (stack->top == 0) { return true; } return false; }/**** 求栈的长度 ****/int GetLenStack(SeqStack *stack) { if (stack == NULL) { return false; } return stack->top; }/**** main.c ****/#include "SeqStack.h"int main() { SeqStack s1; ElemTyPE mPtr = 0; ElemTyPE mPcur = 0; ElemTyPE mPlen = 0; int i; /****初始化一个栈****/ CreateStack(&s1); for (i=0;i<10;i++) { /****压栈(入栈)操作****/ PushStack(&s1,i+1); } GetTopStack(&s1,&mPtr); printf ("top Data: %d\n",mPtr);#if 0 /****出栈(弹栈)****/ PopStack(&s1,&mPcur); printf ("mPcur = %d\n",mPcur); ListStack(&s1); /****销毁栈****/ //DestoryStack(&s1); /****返回栈顶元素****/#endif /****输出栈的元素个数****/ ListStack(&s1); /**** 判断栈是否为空 ****/ if (EmptyStack(&s1)) { printf ("Empty Stack.\n"); } else printf ("Not empty Stack.\n"); /****求栈的长度****/ mPlen=GetLenStack(&s1); printf ("mPlen = %d\n",mPlen); system("pause"); return 0; }
1 0
- 数据结构:栈的顺序存储
- 数据结构-栈的顺序存储
- 数据结构-栈的顺序存储
- 数据结构---栈---顺序存储
- 数据结构 栈的顺序存储结构
- 常用数据结构之顺序存储的栈
- 数据结构三栈的顺序存储结构
- 数据结构:栈的顺序存储结构
- 数据结构:栈的顺序存储实现
- 数据结构--栈的顺序存储
- 数据结构之栈的顺序存储表示
- 数据结构:栈的顺序存储结构
- 数据结构——栈的顺序存储
- 数据结构:栈的顺序存储(二)
- 数据结构:栈的顺序存储(三)
- 数据结构-【栈】的链式存储和顺序存储
- 数据结构-栈的顺序存储和链式存储
- 数据结构的顺序存储结构
- WebService简单实例
- Hibernate继承映射,数据表的继承
- Retrofit2+RxJava学习小计(一):单文件、多文件上传之填平的坑
- 【IMWeb训练营作业】todo-list
- scala面向接口编程
- 数据结构:栈的顺序存储
- 宾夕法尼亚大学Coursera运动规划公开课学习有感之四
- 浅谈BI领域的数据模型设计(二)
- Java多线程死锁
- uva 384 Slurpys
- 添加列+修改列的数据类型+删除列+修改列的名称
- Caffe源码解读(九):Caffe可视化工具
- 博客
- 算法竞赛入门经典 蛇形数组