经典线性数据结构(数组模拟)

1、今天重温了数组模拟的经典线性数据结构,来记录一下。

2、题目如图:

1、单链表:


代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

int e[N], ne[N], idx, head; 
/* 分别为,value数组,next数组,索引值(当前可用的节点编号),头节点。*/

void init()   //初始化
{
    idx = 0;
    head = -1; //初始无节点,头指针指向-1(空)
}

void add_to_head(int x) //头插节点
{
    e[idx] = x;
    ne[idx] = head;
    head = idx;
    idx ++;
}

void add_behind_k(int k, int x)
{
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx ++;
}

void remove_behind_k(int k)
{
    ne[k] = ne[ne[k]]; //k的下一个节点变成k的下一个的下一个节点
}

int m;

int main()
{
    cin >> m;
    init();
    while (m -- )
    {
        char c;
        scanf("%s", &c);
        if(c == 'H')
        {
            int x = 0;
            scanf("%d", &x);
            add_to_head(x);
        }
        else if(c == 'D')
        {
            int k = 0;
            scanf("%d", &k);
            if(k == 0) head = ne[head]; //特判,移除头节点情况
            remove_behind_k(k - 1);// !!!注意传入k-1才能删除第k个数
        }
        else
        {
            int k = 0, x = 0;
            scanf("%d%d", &k, &x);
            add_behind_k(k - 1, x); //同样注意k-1。
        }
    }
    for (int i = head; i != -1; i = ne[i] ) printf("%d ",e[i]);
    
}

2、双链表:


代码如下:

#include<bits/stdc++.h>

using namespace std;

const int N = 1e5+10;

int e[N], l[N], r[N], idx;

void init()
{
    r[0] = 1;
    l[1] = 0;
    idx = 2; //0和1已经占用。0为头1为尾
}

void r_insert(int k, int x) //k右插入一个数
{
    e[idx] = x;
    r[idx] = r[k];
    l[idx] = k;
    l[r[k]] = idx;
    r[k] = idx;
    idx ++; // 不要忘记idx更新
}

void delete_k(int k)
{
    l[r[k]] = l[k];
    r[l[k]] = r[k];
}

int m;

int main()
{
    cin >> m;
    init(); // !!!!一定要记得初始化!!!!
    
    while (m -- )
    {
        string c;
        cin >> c;
        if( c == "L")
        {
            int x;
            scanf("%d", &x);
            r_insert(0, x);
        }
        else if(c =="R")
        {
            int x;
            scanf("%d", &x);
            r_insert(l[1], x);
        }
        else if(c == "D")
        {
            int k;
            scanf("%d", &k);
            delete_k(k + 1); 
            //!!!!因为k是第k个插入的数,k下标 = k + 2 - 1(0,1已经被占用)
        }
        else if(c == "IL")
        {
            int k, x;
            scanf("%d%d", &k, &x);
            r_insert(l[k + 1], x); //k左插即k左点右插
        }
        else
        {
            int k, x;
            scanf("%d%d", &k, &x);
            r_insert(k + 1, x);
            
        }
    }
    for (int i = r[0]; i != 1; i =r[i] ) printf("%d ", e[i]);
}

3、栈与队列:


代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

int stk[N], top;

int m;

int main()
{
    cin >>m;
    while (m -- )
    {
        string c;
        cin >> c;
        if(c == "push")
        {
            int x;
            scanf("%d", &x);
            stk[++ top] = x;
        }
        else if(c == "pop" )
        {
            int x;
            scanf("%d", &x);
            top --;
        }
        else if(c == "empty")
        {
            if(top == 0) printf("YES\n");
            else printf("NO\n");
        }
        else
        {
            printf("%d\n",stk[top]);
        }
    }
}


代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

int queue[N], hh, tt = -1;

int m;

int main()
{
    cin >>m;
    
    while (m -- )
    {
        string c;
        cin >> c;
        if(c == "push")
        {
            int x;
            scanf("%d", &x);
            queue[++ tt] = x;
        }
        else if(c == "pop")
        {
            hh ++;
        }
        else if(c == "empty")
        {
            if(hh>tt) printf("YES\n"); //注意这里,hh=tt的话,是队列还有一个元素
            else printf("NO\n");
        }
        else
        {
            printf("%d\n", queue[hh]);
        }
    }
}

3、总结

没什么可说的。。。。。基础数据结构,熟练掌握。

posted @ 2022-01-14 20:41  Medjay  阅读(70)  评论(0)    收藏  举报