26号数据结构

一、栈stack

栈:只允许在表尾进行插入和删除的操作受限的线性表

逻辑结构:线性结构(一对一)

存储结构:顺序存储(顺序栈)、链式存储(链栈)

栈的特点:先进后出(first in last out FILO表),后进先出(last in first out LIFO表)

如栈顺序ABC,入栈的过程可以出栈,问有几种情况?

CBA ABC ACB BCA BAC

顺序栈

顺序栈:栈借助于顺序存储实现

栈的结构体定义:数据元素,栈顶

 顺序栈的操作

2.1 顺序栈的堆区申请

2.2 顺序栈的入栈

2.3 顺序栈的出栈

2.4 顺序栈的遍历

链栈

链栈:栈借助于链式存储结构实现

26号数据结构_第1张图片

如果链栈的插入删除等于加链表的头插头删,单链表的头等价于栈的栈顶

如果链栈的插入删除等于加链表的尾插尾删,单链表的尾等价于栈的栈顶

队列queue

队列:只允许在表尾插入,表头删除的操作受限的线性表

逻辑结构:线性结构(一对一)

存储结构:顺序储存(顺序队列,循环队列),链式存储(链式队列)

队列的特点:先进先出(first in first out FIFO表),后进后出(last in last out LILO表)

顺序队列

1.1 队头front:第一个数据元素的下表

1.2 队尾rear:最后一个数据元素的下表加1

1.3 队满: rear==MAXSIZE

1.4 队空:front==rear

1.5 定义队列的结构体:数据元素、队头front、队尾rear

typedef struct Q

{               //数据元素 datatype data[MAXSIZE];

                //队头 int front;

                 //队尾 int rear;

 }*queue

循环队列

顺序队列存在假溢出情况,所以引出循环队列用来解决假溢出问题

循环队列入队循环队列入队

int enqueue(queue list,datatype element)

{

                //1.判断队列是否创建

                //2,判断队列是否为满

                if(NULL==list || list->front==(list->rear+1)%MAXSIZE)

                return FALSE;

                //3,入队:在队尾

                list->data[list->rear]=element;

                list->rear=(list->rear+1)%MAXSIZE;

                return SUCCESS;

}

循环队列出队

int delqueue(queue list)

  { 

                          //1,判断队列是否创建

                         //2,判断队列是否为空a

                        if(NULL==list || list->front==list->rear)

                        return FALSE;

                        //3,出队

                        printf("delqueue is %d\n",list->data[list->front]);

                        list->front=(list->front+1)%MAXSIZE;

                        return SUCCESS;

}

循环队列遍历

void output(queue list)

{

                   //1.判断队列是否为空

                  //2,判断队列是否创建

                   if(NULL==list|| list->front==list->rear)

                 return;

                  //3,循环输出

               for(int i=list->front;i!=list->rear;i=(i+1)%MAXSIZE)

                  { printf("%d ",list->data[i]); }

               puts("");

}

循环队列计算个数

int length(queue list)

{ return (MAXSIZE-list->front+list->rear)%MAXSIZE; }

链式队列

循环队列存在队满的情况,适用于数据量较小的时候,那么引出链式队列

存储结构使用链式存储,并且不存在队满的状态。

链式队列的插入和删除等价于单链表的头插尾删,尾插头删

26号数据结构_第2张图片

如果队列插入删除选择头插尾删,单链表的头等价于队列的队尾,单链表的尾等价于队列的队头

如果队列插入删除选择尾插头删,单链表的头等价于队列的队头,单链表的尾等价于队列的队尾

折半查找\二分查找O(log2n)

前提条件:查找的序列必须有序

26号数据结构_第3张图片

你可能感兴趣的:(笔记)