数据结构-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;
}
相关推荐
Chan163 分钟前
Java 集合面试核心:ArrayList/LinkedList 底层数据结构,HashMap扩容机制详解
java·数据结构·spring boot·面试·intellij-idea
cheniie24 分钟前
【Janet】数据结构
数据结构·janet
xier_ran24 分钟前
力扣(LeetCode)100题:41.缺失的第一个正数
数据结构·算法·leetcode
Miraitowa_cheems3 小时前
LeetCode算法日记 - Day 104: 通配符匹配
linux·数据结构·算法·leetcode·深度优先·动态规划
程序员东岸3 小时前
从零开始学二叉树(上):树的初识 —— 从文件系统到树的基本概念
数据结构·经验分享·笔记·学习·算法
蕓晨3 小时前
数据结构 图 的邻接表建立
数据结构·c++
qq_401700415 小时前
嵌入式常用宏定义
数据结构
Kuo-Teng6 小时前
LeetCode 19: Remove Nth Node From End of List
java·数据结构·算法·leetcode·链表·职场和发展·list
洛_尘8 小时前
数据结构--7:排序(Sort)
java·数据结构
2401_841495648 小时前
【LeetCode刷题】找到字符串中所有字母异位词
数据结构·python·算法·leetcode·数组·滑动窗口·找到字符串中所有字母异位词