数据结构-其他线性结构(栈和队列)

2019-07-27  本文已影响0人  堂前雪半

大纲:

  1. *掌握栈的定义、栈的存贮结构及基本操作的实现。
  2. 理解用栈实现表达式的求值,递归过程及实现。
  3. 掌握队列的定义、存贮结构及基本操作的实现。
  4. 理解串的逻辑定义及其基本操作;理解串的存贮结构。
  5. 理解数组的定义、数组的顺序存贮结构及矩阵的存贮压缩。
  6. 理解广义表的定义及存贮结构。

栈的基本概念

  1. 栈的定义

    只允许在一端进行插入或删除操作的线性表

    • 栈顶:栈允许进行插入和删除的那一端
    • 栈底:固定的,不允许进行插入和删除的另一端
    • 栈是一个后进先出的线性表
  2. 栈的基本操作


顺序栈

栈的顺序存储

#define MaxSize 50  //定义栈中元素的最大个数
typedef struct{
  Elemtype data[MaxSize];  //存放栈中元素
  int top;  //栈顶指针
}SqStack;

链栈

采用链式存储的栈,通常采用单链表实现,并规定所有操作在单链表的表头进行,且链栈没有头结点,Lhead指向栈顶元素。

结构体描述

typedef struct Linknode{
  ElemType data;
  struct Linknode *next;
}*LiStack;

队列

队列的基本概念

  1. 队列的定义

    只允许在表的一段进行插入,表的另一端进行删除

    • 队头:允许删除的一端
    • 队尾:允许插入的一端
    • 空队列:不含任何元素的空表
    • 队列是一个先进先出的线性表
  2. 队列的基本操作

    • InitQueue(&Q):初始化队列
    • QueueEmpty(Q):判队列空
    • EnQueue(&Q):入队
    • DeQueue(&Q,&x):出队
    • GetHead(Q,&x):读队头元素

队列的顺序存储结构

队列的顺序存储

分配一块连续的存储单元存放队列中的元素,并设置两个指针front和rear分别指示队头元素和队尾元素的位置。

结构体描述

#define MaxSize 50
typedef struct{
  ElemType data[MaxSize];
  int front,rear;
}SqQueue;
循环队列

将顺序队列想象成一个环状空间,也就是逻辑上将存储队列元素的表看成一个环,即循环队列

//初始化
void InitQueue(&Q){
  Q.front=Q.rear=0;
}
//判队空
bool isEmpty(Q){
  if(Q.rear==Q.front)
    return true;
  else
    return false;
}
//入队
bool EnQueue(SqQueue &Q,ElemType x){
  if((Q.rear+1)%MaxSize==Q.front)  //队满
    return false;
  Q.data[Q.rear]=x;
  Q.rear=(Q.rear+1)%MaxSize;  //队尾指针加一取模
  return true;
}
//出队
bool DeQueue(SqQueue &Q,ElemType &x){
  if(Q.rear==Q.front)
    return false;
  x=Q.data[Q.front];
  Q.front=(Q.front+1)%MaxSize;  //队头指针加一取模
  return true;
}

队列的链式存储结构

队列的链式表示即链队列

typedef struct{  //链式队列结点
  ElemType data;
  struct LinkNode *next;
}LinkNode;
typedef struct{  //链式队列
  LinkNode *front,*rear;  //队列的队头和队尾指针
}LinkQueue;
//初始化
void InitQueue(LinkQueue &Q){
  Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
  Q.front->next=NULL;
}
//判队空
bool IsEmpty(LinkQueue Q){
  if(Q.front==Q.rear)
    return true;
  else
    return false;
}
//入队
void EnQueue(LinkQueue &Q,ElemType x){
  s=(LinkNode *)malloc(sizeof(LinkNode));
  s->data=x;
  s->next=NULL;
  Q.rear->next=s;
  Q.rear=s;
}
//出队
void DeQueue(LinkNode &Q,Elemtype &x){
  if(Q.front==Q.rear)
    return false;
  p=Q.front->next;
  x=P->data;
  Q.front->next=p->next;
  if(Q.rear==p)   //若原队列中只有一个结点,删除后变空
    Q.rear=Q.front;
  free(p);
  return true;
}

双端队列

双端队列是指允许两端都可以进行入队和出队操作的


栈和队列的应用

  1. 中缀转后缀表达式
    • 若为‘(’,入栈
    • 若为‘)’,则依次把栈中的运算符加入后缀表达式,直到出现‘(’,并从栈中删除‘(’
    • 若为‘+’,‘-’,‘*’,‘/’
      • 栈空,入栈
      • 栈顶元素为‘(’,入栈
      • 高于栈顶元素优先级,入栈
      • 否则,依次弹出栈顶运算符,直到一个优先级比他低的运算符或‘)’为止
        *遍历完成,若栈非空,依次弹出所有元素

矩阵

压缩矩阵:指多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。其目的是为了节省存储空间
特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。常见特殊矩阵有对称矩阵、上(下)三角矩阵、对角矩阵等
特殊矩阵的压缩存储方法:找出特殊矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布的值的多个矩阵元素压缩存储到一个存储空间中

  1. 对称矩阵
    元素下标的对应关系
    k = i * ( i - 1 ) / 2 + j - 1 ; i >= j
    k = j * ( j - 1 ) / 2 + i - 1 ; i < j
  2. 三角矩阵
    下三角矩阵元素下标的对应关系
    k = i * ( i - 1 ) / 2 + j - 1 ; i >= j
    k = n * ( n + 1 ) / 2 ; i < j
    上三角矩阵元素下标的对应关系
    k = ( i - 1 ) * ( 2n - i + 2 ) / 2 + ( j - i ) ; i <= j
    k = n * ( n + 1 ) / 2 ; i > j
  3. 三对角矩阵
    元素下标的对应关系
    k = 3 * ( i - 1 ) - 1 + j - i + 1 = 2i + j - 3
    已知k求i、j
    i = [ ( k + 1 ) / 3 + 1 ] ; j = k - 2i + 3

稀疏矩阵

矩阵元素个数远大于非零元素个数的矩阵

上一篇 下一篇

猜你喜欢

热点阅读