关于数据结构(三)

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法索引技术有关

目录

1.栈的定义和特点

2.队列的定义和特点

3.栈的类型定义

4.顺序栈的表示和实现

1.初始化

2.入栈

3.出栈

4.取栈顶元素

5.小总结


1.栈的定义和特点

是限定仅在表尾进行插入或删除操作的线性表。因此,对来说,表尾端有其特殊含义,成为栈项,相应地,表头端称为栈底(bottom)。不含元素的空表成为空栈。

假设S=(a1,a2,...,an),则称a1栈底元素an栈顶元素。栈中元素按a1,a2,...an的次序进栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。因此,栈又称为 后进先出 线性表

2.队列的定义和特点

相反,队列是一种先进后出的线性表。它只允许在表的一段进行插入,而在另一端删除元素。这和日常生活中的排队是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一端成为队尾,允许删除的一端则成为队头。假设队列为q=(a1,a2,...,an),那么,a1就是队头元素,an则是队尾元素。队列中的元素是按照a1,a2,...,an的顺序进入的,退出队列也只能按照这个次序依次退出,也就是说,只有在a1,a2,...,an-1都离开队列之后,an才能退出队列。

3.栈的类型定义

栈的基本操作除了入栈和出栈外,还有栈的初始化、栈空的判定,以及取栈顶元素等。下面给出栈的抽象数据类型定义:

ADT STack{
数据对象:D={a,}
数据关心:R={<ai-1,ai>}

基本操作:
   InStack(&S)
     操作结果:构造一个空栈S。
   DestyoyStack(&S)
     初始条件:栈S已存在。
     操作结果:栈S已被销毁。
   ClearStack(&S)
     初始条件:栈S已存在。
     操作结果:栈S清为空栈。
   StackEmpty(S)
     初始条件:栈S已存在。
     操作结果:若栈S为空栈,则返回true,否则返回false。
   StackLength(S)
     初始条件:栈S已存在
     操作结果插入元素e为新的栈顶元素。  
   GetTop(S)
     初始条件:栈S已存在且非空。
     操作结果:返回S的栈项元素,不修改栈项指针。
   Push(&S,e)
     初始条件:栈S已存在。
     操作结果:插入元素e为新的的元素
   Pop(&S,&e)
     初始条件:栈S已存在且非空。
     操作结果:删除S的栈顶元素,并且e返回其值。
   StackTraverse(S)
     初始条件:栈S已存在且非空。
     操作结果:从栈底到栈顶依次对S的每个数据元素访问。
}ADT Stack

4.顺序栈的表示和实现

      顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。通常习惯的做法是:以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C语言作描述语言时,如此设定会带来极大的不便,因此另设指针base指示栈底元素在顺序栈中的位置,当top和base的值相等时,表示空栈。顺序栈的定义如下:

#define MAXSIZE 100    //顺序栈存储空间的初始分配量
typedef struct  
{
  SElemType *base;     //栈底指针
  SElemType *top;      //栈顶指针
  int Stacksize;       //栈可用的最大容量

}SqStack;

1.初始化

Status InitStack(SqStack &S)
{//构造一个空栈
  S.base=new SElemType[MAXSIZE];    //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
  if(!S.base)exit(OVERFLOW);        //存储分配失败
  S.top=S.base;                     //top初始为base,空栈
  S.stacksize=MAXSIZE;              //stacksize置为栈的最大容量MAXSIZE
  return OK;

}

2.入栈

Status Push(SqStack &S,SElemType e)
{
  if(S.top-S.base==S.stacksize) return ERROR;   //栈满
  *S.top++=e;                                   //将元素e压入栈顶,栈顶指针加1
  return OK;
}

3.出栈

Status Pop(SqStack &S,SElemType &e)
{//删除S的栈顶元素,用e返回其值
   if(S.top==S.base) return ERROR;   //栈空
   e=*--S.top;                         //栈顶指针减1,将栈顶元素赋给e
   return OK;
}

4.取栈顶元素

SElemType GetTop(SqStack S)
{//返回S的栈顶元素,不修改栈顶指针
  if(S.top!=S.base)           //栈非空
   reuturn *(S.top-1);        //返回栈顶元素的值,栈顶指针不变

}

5.小总结

本次内容主要了讲解了数据结构中的一些基础知识点,主要内容顺序表的有关知识本篇内容都为数据结构的基本思想,若想更深的理解以及体会,还请大家在日常学习中多多努力,希望大家学有所成。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Joker700

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值