当前位置:   article > 正文

数据结构基础

数据结构基础

数据结构与算法是我们大二将要学的,所以有些难度

开篇小提问:(答案在结尾)


1、数据结构(Data Structure)概念:

    · 数据元素之间不是孤立存在,之间存在某种关系,数据元素之间的关系称为结构

    · 是指相互之间存在一种或多种特定关系的数据元素集合

    · 换言之,数据结构是带结构的数据元素的集合

什么是栈?

官方定义:后进先出的线性表,要求只在表尾进行删除和插入的操作。

实质是线性表,所以根据线性表的两种存储形式有两种栈的存储结构

栈中不含任何数据时,叫做空栈,此时栈顶就是站底。

录入数据时,数据从栈顶进入,栈顶栈底分离,整个栈的当前容量变大。

数据出栈时,从栈顶弹出,栈顶下移,整个栈的当前容量变小。

我个人理解栈就像一个汉堡,刚开始时候,只是两个面包片,带芝麻的朝上的的是栈顶,挨着表尾。不带芝麻的另一片面包是栈底,挨着表尾。

当想要加入生菜或者肉片(录入数据)就要打开上片面包(栈顶

当想要拿走生菜或者肉片(导出数据)也要打开上片面包(栈顶

加入/取走的食材越多(录入/导出数据越多) 面包的高度越厚/薄(当前容量越大/小

一、栈的顺序存储结构

  1. typedef struct
  2. {
  3. ElemType *base; //创建指向栈底的指针
  4. ElemType *top; //创建指向栈顶的指针
  5. int stackSize; //栈的当前可使用的最大容量
  6. }sqStack; //顺序栈

创建一个栈:

  1. #define STACK_INIT_SIZE 100
  2. initStack(sqStack*s)
  3. {
  4. s->base = (ElemType *)malloc(
  5. STACK_INIT_SIZE * sizeof(ElemType) );
  6. if( !s->base )
  7. exit(0);
  8. s->top = s->base; //最开始时候,栈顶就是栈尾
  9. s->stackSize = STACK_INIT_SIZE;
  10. }

入栈:

又称作压栈,每次在栈顶入栈,top指针就加一。

  1. #define STACKINCREMENTS 10
  2. Push(sqStack *a,ElemType e)
  3. {
  4. //如果栈满 追加空间
  5. if( s->top - s->base >= s->stackSize )
  6. {
  7. s->base = (ElemType *)realloc(s->base,(s->stackSize + STACKINCREMENT) * sizeof(ElemType));
  8. if( !s->base )
  9. exit(0);
  10. s->top = s->base + s->stackSize; //设置栈顶
  11. s->stackSize = s->stackSize + s->STACKINCREMENTS; //设置栈的最大容量
  12. }
  13. *(s->top)=e;
  14. s->top++;
  15. }

出栈:

  1. Pop(sqStack *s, ElemType *e)
  2. {
  3. if( s->top = s->base ) //判断栈空
  4. return;
  5. *e = *--(s->top);
  6. } //在栈顶取出数据,栈顶指针下移,当前容量减一

清空一个栈:

  1. ClearStack(sqStack*S)
  2. {
  3. s->top = s->base;
  4. }

销毁一个栈:(释放该栈所占物理空间)

  1. DstoryStack(sqStack *S)
  2. {
  3. int i,len;
  4. len = s->stackSize;
  5. for( i=0;i< len; i++ )
  6. {
  7. free( s->base );
  8. }
  9. s->base = s->top = NULL;
  10. s->stackSize = 0;
  11. }

计算栈的当前容量:(所含元素个数)

  1. int StackLen(sqStack s)
  2. {
  3. return (s.top - s.base)
  4. //中间隔了几个元素,就相当于指针的差值再除以每个单元所占的内存,指针可相减,不可相加
  5. }

二、栈的链式存储结构

利用栈只在栈顶插入和删除的特性,将栈顶放在单链表表头,使栈顶指针和单链表合二为一。

·链栈不存在满的情况(除非内存空间无)

·链栈空时:top->null(头指针指向空)

创建一个栈(链表):

  1. public class LinkedStack<E> implements Stack<E>
  2. {
  3. private LinkedList<E> list; //创建一个链表
  4. public LinkedStack(){ //构造函数
  5. list=new LinkedList();
  6. }

获取结点个数判断和非空:

  1. //获取结点个数
  2. public int getSize()
  3. {
  4. return list.getSize();
  5. }
  6. //判空
  7. public boolean isEmpty()
  8. {
  9. return list.isEmpty();
  10. }

入栈:

  1. public void push(E e)
  2. {
  3. list.addFirst(e); //调用list的头插函数
  4. }

出栈:

  1. public E pop()
  2. {
  3. return list.removeFirst(); //调用list的尾删函数
  4. }

获取栈顶元素:

  1. public E peek()
  2. {
  3. return list.getFirst(); //调用list的获取表头元素
  4. }

清空栈:

  1. public void clear()
  2. {
  3. list.clear();
  4. }

迭代器:

  1. @Override
  2. public Iterator<E> iterator() {
  3. return list.iterator(); //调用list的迭代方法
  4. }

 答案:

  2021.7.7 

发的第一篇文章,文章还会更改,很多东西还待改进,主要是为了自己学习和理解,有问题还请指出。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/920211
推荐阅读
相关标签
  

闽ICP备14008679号