数据结构-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;
}
相关推荐
HY小海1 小时前
【数据结构】队列
数据结构
王RuaRua1 小时前
[数据结构]6. 队列-Queue
开发语言·数据结构·算法·leetcode
姜行运1 小时前
数据结构【AVL树】
android·数据结构·c#
chenyuhao20244 小时前
链表面试题9之环形链表进阶
数据结构·算法·链表·面试·c#
chenyuhao20245 小时前
链表的面试题8之环形链表
数据结构·算法·链表·面试·c#
晴空闲雲6 小时前
数据结构与算法-线性表-循环链表(Circular Linked List)
数据结构·算法·链表
一梦浮华6 小时前
自学嵌入式 day21 - 数据结构 双向链表
数据结构·链表
四谷夕雨6 小时前
C++数据结构——红黑树
开发语言·数据结构·c++
SylviaW087 小时前
python-leetcode 69.最小栈
数据结构·算法·leetcode