数据结构-DAY05

一、栈的概念

1.栈是限定仅在表尾进行插入和删除操作的线性表。先进后出、后进先出

栈顶:允许操作的一端

栈底:不允许操作的一端入栈,出栈。

栈分为:顺序栈 链式栈

2.栈结构是在堆区创建的

3.优先级就是通过栈来解决的

先进后出,后进先出。

二、队列的概念

1.队列是只允许在一段进行插入,而在另一端进行删除操作的线性表。

允许插入的称谓队尾,允许删除的一端队头。

队列分为:顺序队列,循环队列,

常用操作:出队、入队。

先进先出,FIFO

2.满队:尾 + 1 = 头

3.空队:尾 = 头

4.队列又叫缓冲

三、练习与例题

1.创建栈

复制代码
LinkStack *CreateLinkStack()
{
    LinkStack *ls = (LinkStack *)malloc(sizeof(LinkStack));
    if(NULL == ls)
    {
        fprintf(stderr, "CreateLinkStack malloc");
        return NULL;
    }

    ls->top = NULL;
    ls->clen = 0; 
    return ls;
}

2.入栈(头插法)

复制代码
int PushLinkStack(LinkStack *ls, DATATYPE *data) //入栈
{
    LinkStackNode *newnode = (LinkStackNode *)malloc(sizeof(LinkStackNode));
    if(NULL == ls)
    {
        fprintf(stderr, "CreateLinkStack malloc");
        return 1;
    }int len = GetSizeLinkStack(ls);
    memcpy(&newnode->data, data, sizeof(DATATYPE));
    newnode->next = NULL;
    newnode->next = ls->top;
    ls->top = newnode;
    ls->clen++;
    return 0;
}

3.销毁栈区

复制代码
int DestoryLinkStack(LinkStack *ls)
{
    LinkStackNode *tmp = ls->top;
    while(tmp)
    {
        ls->top = ls->top->next;
        free(tmp);
        tmp = ls->top;
    }
    free(ls);
    return 0;
}

4.获取栈区的内容

复制代码
DATATYPE *GetTopLinkStack(LinkStack *ls)
{
    if(IsEmptyLinkStack(ls))
    {
        return NULL;
    }
    return &ls->top->data;
}

5.出栈(头删)

复制代码
int PopSeqStack(LinkStack *ls) // 头删
{
    if(IsEmptyLinkStack(ls))
    {
        return 1;
    }
    LinkStackNode *tmp = ls->top;
    ls->top = ls->top->next;
    free(tmp);
    ls->clen--;
    return 0;
}

6.主函数运行

复制代码
int main(int argc, char *argv[])
{
    LinkStack *ls = CreateLinkStack();
    DATATYPE data[] = {
        {"maodan", 'F', 20, 80},  {"xiaofan", 'M', 21, 83},
        {"jett", 'F', 22, 83},   {"viper", 'M', 40, 90},
        {"runa", 'M', 41, 92}, {"gpw", 'F', 32, 63},
    };
    int i;
    for(i = 0; i < 6; ++i)
    {
        PushLinkStack(ls, &data[i]);
    } 
    
    int len = GetSizeLinkStack(ls);
    for(i = 0; i < len; ++i)
    {
        DATATYPE *tmp = GetTopLinkStack(ls);
        printf("%s %c %d %d\n",tmp->name,tmp->sex,tmp->age,tmp->score);
        PopSeqStack(ls);
    }

    DestoryLinkStack(ls);
    ls = NULL;
    return 0;
}

7.队列为空

复制代码
int IsEmptySeqQue(SeqQueue *sq)
{ 
  return sq->head == sq->tail; 
}

8.队列为满

复制代码
int IsFullSeqQue(SeqQueue *sq) 
{ 
  return (sq->tail + 1) % sq->tlen == sq->head; 
}

9.入队

复制代码
int EnterSeqQue(SeqQueue *sq, DATATYPE *data) 
{
  if (IsFullSeqQue(sq)) 
  {
    fprintf(stderr, "EnterSeqQue full\n");
    return 1;
  }
  memcpy(&sq->array[sq->tail], data, sizeof(DATATYPE));
  sq->tail = (sq->tail + 1) % sq->tlen;
  return 0;
}

10.销毁队列

复制代码
int DestroySeqQue(SeqQueue *sq) 
{
  free(sq->array);
  free(sq);
  return 0;
}

11.创建队列

复制代码
SeqQueue *CreateSeqQue(int len) 
{
  SeqQueue *sq = (SeqQueue *)malloc(sizeof(SeqQueue));
  if (NULL == sq) 
  {
    fprintf(stderr, "CreateSeqQue malloc\n");
    return NULL;
  }

  sq->array = malloc(sizeof(DATATYPE) * len);
  if (NULL == sq->array) 
  {
    fprintf(stderr, "CreateSeqQue malloc\n");
    return NULL;
  }
  sq->head = 0;
  sq->tail = 0;
  sq->tlen = len ;
  return sq;
}
相关推荐
CSharp精选营3 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假6 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠7 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦14 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠15 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾15 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82115 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q15 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒15 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记15 天前
单项不带头不循环链表
数据结构·链表