数据结构栈与队列的实现(代码片段)

一个正直的男孩 一个正直的男孩     2022-12-23     717

关键词:

基础结构

typedef int STDataType; typedef struct Stack

STDataType* _a;
int top; // 栈顶 
int capacity; // 容量
Stack;

申请空间

void ListCapacity(Stack*ps)

    if(ps->top==ps->capacity)
    
        int newcapacity=ps->capacity==0?4:ps->capacity*2;

        STDataType*ptr=(STDataType*)realloc(ps->data,sizeof(STDataType)*newcapacity);
        if(ptr==NULL)
        
            perror("ptr:");
            exit(-1);
        
        ps->capacity=newcapacity;
        ps->data=ptr;
    

入栈

这儿就是顺序表尾插

  1. 判断容量
  2. 增容
  3. 栈顶++
void StackPush(Stack* ps, STDataType data)//入栈

    ListCapacity(ps);
    ps->data[ps->top]=data;
    ps->top++;


出栈

  • 一定要判空哟,不让就出大问题了,栈顶变成了负数,变成负数那怎么访问下标
  • 就像喝奶茶用筷子一样难受
void StackPop(Stack* ps)// 出栈

    assert(!StackEmpty(ps));
    ps->top--;

取栈顶元素

  • top是顺序表的尾巴,也是栈的顶部,所以栈顶元素就是top这个位置的数据
STDataType StackTop(Stack* ps)

    return ps->data[ps->top];

判空

  • 每次增容栈顶都会更新,跑到新入栈的数据上面,没有数据就代表栈是空的
int StackEmpty(Stack* ps)// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0

    return ps->top==0;

销毁

  • 动态开辟的内存一定要释放,不让造成内存泄露,如果代码长一直不释放就会越来越卡
  • 就像你开机就有好多app占用能的运行内存
void StackDestroy(Stack* ps)

    free(ps->data);
    ps->data=NULL;
    ps->top=0;
    ps->capacity=0;


基础结构

链表结构

typedef struct QListNode 
 
	struct QListNode* _next; 
	QDataType _data; 
QNode; 

队列结构

typedef struct Queue

    QNode* front;//头
    QNode* rear;//尾
Queue;

分共明确,需要哪里就调用那个指针,节省时间且增加效率(后文实现),且这是一种新的方法可以实现

  1. 传二级指针
  2. 创头节点
  3. 返回值
  4. 在传一个结构体(多种不同作用的指针)

入队列

void QueuePush(Queue* q, QDataType data)

    QNode*newnode=(QNode*)malloc(sizeof(QNode));
    newnode->data=data;
    if(QueueEmpty(q))
    
        q->front=q->rear=newnode;
    
    else
    
        q->rear->next=newnode;
        q->rear=q->rear->next;
    

出队列

  • 存下一个节点,在链接即可
void QueuePop(Queue* q)

    QNode*next =q->front->next;
    free(q->front);
    q->front=next;

取队头

  • front为队列的头,也是链表的头,所以取这个队头操作小菜一碟
int QueueEmpty(Queue* q)

    return q->front==NULL&&q->rear==NULL&&q->front==q->rear;

队列元素个数

  • 这里判断条件一定不能为空(此逻辑),位空的话插入新节点置为NULL即可
int QueueSize(Queue* q)

    int count =0;
    QNode* cur=q->front;
    while(cur!=q->rear->next)
    
        count++;
        cur= cur->next;
    
    return count;

取队尾

  • 队尾一直是是背rear指向的,每次查入rear都要跌代(小菜一碟)
QDataType QueueBack(Queue* q)

    assert(!QueueEmpty(q));
    return q->rear->data;

销毁队列

void QueueDestroy(Queue* q)

    QNode*cur=q->front;
    while(cur!=q->rear->next)
    
        QNode*next=cur->next;
        free(cur);
        cur=next;
    
    q->front=NULL;
    q->rear=NULL;


他们其实就是可以看出顺序表与链表的一种变种


如果看到错误请直接在评论留言哪里可以优化或者有更好的方法请直接和我私信,你的指错让我和你变得更加的优秀,如果文章帮到你了,那么请给我点个赞谢谢

3)数据结构之线性表(栈与队列)(代码片段)

目录栈与队列的本质栈的基本概念栈的物理结构栈的顺序存储结构(用数组实现)静态栈的实现: Stack.h中Test/c中Stack.c中输出结果动态栈的实现 Stac.h中Test.c中Stack.c中栈的链式存储结构(使用链表实现) Stack... 查看详情

javascript实现栈与队列的操作(代码片段)

目录栈队列栈栈是一种非常常见的数据结构,在程序中应用广泛。我们知道数组是一种线性结构虽然麻烦,但可以在数组的任意位置插入和删除数据。但为了实现某些功能,必须对这种任意性加以限制,而栈和队... 查看详情

栈与队列(代码片段)

最近一直在看数据结构与算法,下面是对有线性结构的栈与队列的总结:栈相关的内容定义:栈是限定仅在表尾进行插入和删除操作的线性表。(后进先出的线性表)操作:在可以插入与删除的一端称为栈顶,另外一端称为栈底... 查看详情

数据结构习题--栈与队列(代码片段)

双栈模拟队列基本思路:队列是先进先出,栈是先进后出。用一个输入栈存进队元素,用一个输出栈将输出栈中的元素倒置,再出栈。这就实现了队列的先进先出。注意:队满的条件为输入栈S1满且输出栈S2非空。并非输入栈满... 查看详情

数据结构栈与队列---栈的应用(递归和分治思想)(代码片段)

(一)递归定义我们把一个直接调用自己活着通过一系列的调用语句间接的调用自己的函数,称做递归函数。一般,若是我们知道循环的次数,就不要使用递归,使用迭代同样可以实现。而且递归效率太低。使用不多。另外:递... 查看详情

栈与队列(代码片段)

...后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。实际上,栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。用数组实现的栈classStackconstruc... 查看详情

数据结构与算法栈与队列c语言版(代码片段)

目录3.1栈和队列的定义和特点3.2栈、队列与一般线性表的区别3.3栈的表示和操作的实现顺序栈与顺序表=================顺序栈的表示顺序栈初始化判断顺序栈是否为空求顺序栈的... 查看详情

数据结构栈与队列(代码片段)

...码队列概念及结构队列的实现结构的选择相关操作的实现数据结构的定义队列的初始化销毁队列判断队列是否为空入队操作出队操作获取队头元素获取队尾元素获取有效元素个数测试代码获取原码:栈概念及结构一种特殊的... 查看详情

数据结构栈与队列(代码片段)

...码队列概念及结构队列的实现结构的选择相关操作的实现数据结构的定义队列的初始化销毁队列判断队列是否为空入队操作出队操作获取队头元素获取队尾元素获取有效元素个数测试代码获取原码:栈概念及结构一种特殊的... 查看详情

重学数据结构栈与队列(代码片段)

...是浮动的。堆这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶&#x 查看详情

数据结构--栈与队列(代码片段)

一.栈一.顺序栈的实现A.栈的定义1.栈是一种特殊的线性表2.栈仅能在线性表的一端进行操作a.栈顶:允许操作的一端b.栈底:不允许操作的一端B.栈的特性后进先出(图示)C.栈的操作1.创建栈2.销毁栈3.清空栈4.进栈5.出栈6.获取栈顶元... 查看详情

数据结构算法--栈与队列(代码片段)

数据结构算法(1)--栈与队列总结并记录学习数据结构过程中遇到的问题及算法.一些常见算法:Note:基础应用.递归的非递归转化.阶乘递归实现:#include<iostream>usingnamespacestd;intF(intn)if(n==0||n==1)return1;elsereturnn*F(n-1);intmain()ints;cin>&... 查看详情

栈与队列专题(代码片段)

1.定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。  方法:1.使用两个栈stackData,stackMin,一个记录数据,另一个栈确保栈顶是当前数据栈的最小元素     2.入栈:若stackMin空,则直接入,否则如... 查看详情

浅谈栈与队列(c语言)(代码片段)

文章目录栈的定义栈的实现前置初始化栈栈的销毁栈的插入出栈的操作取栈顶元素栈的大小队列的定义队列的基本操作队列的初始化队列的销毁队列的插入队列的删除队列的判空取出队头元素取出队尾元素队列的大小点个赞把栈... 查看详情

浅谈栈与队列(c语言)(代码片段)

文章目录栈的定义栈的实现前置初始化栈栈的销毁栈的插入出栈的操作取栈顶元素栈的大小队列的定义队列的基本操作队列的初始化队列的销毁队列的插入队列的删除队列的判空取出队头元素取出队尾元素队列的大小点个赞把栈... 查看详情

浅谈栈与队列(c语言)(代码片段)

文章目录栈的定义栈的实现前置初始化栈栈的销毁栈的插入出栈的操作取栈顶元素栈的大小队列的定义队列的基本操作队列的初始化队列的销毁队列的插入队列的删除队列的判空取出队头元素取出队尾元素队列的大小点个赞把栈... 查看详情

数据结构之栈与队列(代码片段)

栈 队列栈的实现 顺序表实现 classStack(object):"""栈"""def__init__(self):self.__list=[]#选用顺序表或链表defpush(self,item):"""压栈"""self.__list.append(item)#时间复杂度O(1)self.__list.insert(0,item)#头部插入,时间复杂度O(n)#说明:链表结构的... 查看详情

单调栈与队列的概念与练习!建议收藏(代码片段)

本期文章,小编给大家介绍一下数据结构中很重要的两个角色,那就是栈与队列两兄弟。文中若有欠妥之处,还望指正!感谢!文章目录一、栈与队列的概念1、栈2、队列二、栈的运用题目:逆波兰表达式... 查看详情