数组模拟链表、栈、队列

简介: 数组模拟链表、栈、队列

模拟单链表



    static int N=100010;
    //head存储链表头指针,e[]存储节点的值,ne[]存储节点的next指针,index表示当前用到了哪个节点
    static int head,index;
    static int []e=new int[N];
    static int []ne=new int[N];
    //链表初始化
    static void init(){
        head=-1;
        index=0;
    }
    //头插法
    static void add_head(int x){
        e[index]=x;
        ne[index]=head;
        head=index++;
    }
    //将x插到下标为k的点的后面
    static void add(int k,int x){
        e[index]=x;
        ne[index]=ne[k];
        ne[k]=index;
        index++;
    }
    //删除头节点,需要判断头节点存在
    static void del_head(){
        head=ne[head];
    }
    //将下标是k的点的后面的点删掉
    static void del(int k){
        ne[k]=ne[ne[k]];
    }
    //输出链表
    for(int i=head;i!=-1;i=ne[i]){
        System.out.print(e[i]+" ");
     }


模拟双向链表


// e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,index表示当前用到了哪个节点
    static int head,index;
    static int []e=new int[N];
    static int []l=new int[N];
    static int []r=new int[N];
    //链表初始化
    static void init(){
        //0,1表示左边界和右边界,index = 2为下一个新节点的地址
        r[0] = 1;  l[1] = 0;
        index = 2;
    }
    //在最左端插入x
    static void insert_l(int x){
        e[index]=x;
        r[index]=r[0];
        l[index]=0;   //这个可不指,但反向遍历就需要,所以最好也指
        l[r[0]]=index;
        r[0]=index++;
    }
    //在最右端插入x
    static void insert_r(int x){
        //在右边界前插入时,新节点的右指针也要指向边界,否则无法遍历到边界(超时)
        e[index]=x;
        l[index]=l[1];
        r[index]=1;
        r[l[1]]=index;
        l[1]=index++;
    }
    //在第 k 个插入的数后面插入一个数
    static void insert_k(int k,int x){
        e[index]=x;
        l[index]=k;
        r[index]=r[k];
        l[r[k]]=index;
        r[k]=index++;
    }
    //在第 k 个插入的数后面删除一个数
    static void del(int k){
        l[r[k]]=l[k];
        r[l[k]]=r[k];
    }


模拟栈


特点:先进后出


    static int N=100010;
    static int []stk=new int[N];
    static int tt=0;  //tt表示栈顶
        //向栈顶插入元素
        stk[tt++]=x;
        //从栈顶退出元素
        tt--;
        //栈顶元素
        int top=stk[tt];
        //判断栈是否为空
        if(tt>0)


模拟队列


特点:先进先出


// hh 表示队头,tt表示队尾
static int []q=new int[N];
static int hh = 0, tt = -1;
// 向队尾插入一个数
q[ ++ tt] = x;
// 从队头走出一个数
hh ++ ;
// 队头的值
q[hh];
// 判断队列是否为空
if (hh >tt)   //队列为空


模拟循环队列


// hh 表示队头,tt表示队尾的后一个位置
static int []q=new int[N];
static int hh = 0, tt = -1;
// 向队尾插入一个数
q[tt ++ ] = x;
if (tt == N) tt = 0;
// 从队头弹出一个数
hh ++ ;
if (hh == N) hh = 0;
// 队头的值
q[hh];
// 判断队列是否为空
if (hh != tt)


相关文章
|
2月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
117 64
|
24天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
45 5
|
1月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
48 0
|
2月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
23 0
|
7月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
6月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
6月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
6月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
65 2
|
7月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
62 1
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表