编程题学习

acwing

826. 单链表

cpp 复制代码
#include <iostream>

using namespace std;

const int N = 100010;

int idx, e[N], ne[N], head;


void init()
{
    head = -1;
    idx = 0;
}

void insert_head(int x)
{
    e[idx] = x;
    ne[idx] = head;
    head = idx ++ ;
}

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

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

int main()
{
    int n;
    cin >> n;
    
    init();
    
    ios::sync_with_stdio(false);
    cin.tie(0);
    char op;
    int x, k;
    while (n -- )
    {
        cin >> op;
        
        if (op == 'H')
        {
            cin >> x;
            
            insert_head(x);
        }
        else if (op == 'D')
        {
            cin >> k;
            if (!k) head = ne[head];
            else
            {
                delete_k(k - 1);
            }
        }
        else
        {
            cin >> k >> x;
            
            delete_k_pos(x, k - 1);
            
        }
    }
    
    for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';
    cout << endl;
    return 0;
}

827. 双链表

cpp 复制代码
#include <iostream>
#include <string>

using namespace std;

const int N = 100010;

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

void init()
{
    r[0] = 1;
    l[1] = 0;
    idx = 2;
}

// 在节点a的右边插入一个数x
void insert_a_right(int a, int x)
{
    e[idx] = x;
    r[idx] = r[a];
    l[idx] = a;
    l[r[a]] = idx;
    r[a] = idx ++ ;
}

// 删除节点a
void delet_k(int a)
{
    l[r[a]] = l[a];
    r[l[a]] = r[a];
}

int main()
{
    int n;
    cin >> n;
    init();
    int x, k;
    
    string op;
    
    while (n -- )
    {
        cin >> op;
            if (op == "L")
        {
            cin >> x;
            
            insert_a_right(0, x);
        }
        else if (op == "R")
        {
            cin >> x;
            
            insert_a_right(l[1], x);
        }
        else if (op == "D")
        {
            cin >> k;
            
            delet_k(k + 1);
        }
        else if (op == "IL")
        {
            cin >> k >> x;
            insert_a_right(l[k + 1], x);
        }
        else
        {
            cin >> k >> x;
            insert_a_right(k + 1, x);
        }
    }
    
    for (int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';
    cout << endl;

    return 0;
}
  1. 之所以在 "D", "IL", "IR" 要用 k+1 的原因是 双链表的起始点是2. 所以,每个插入位置k的真实位置应该为 k-1+2 = k+1 (在单链表中为 k-1)。

  2. 0, 1 节点的作用是边界。0为左边界,1为右边界。他俩在这里有点类似保留字的作用。正因如此,我们的idx也是从2开始

  3. 最后遍历输出结果的 for (int i = rn0; i != 1; i = rni)。从 rn0 开始是因为 0 为左边界,而终止条件 i==1是因为1为右边界(如果碰到,说明已经遍历完毕)

828. 模拟栈

cpp 复制代码
#include <iostream>

using namespace std;

const int N = 100010;

int top = -1;

int stk[N];

int main()
{
    int n;
    cin >> n;
    
    string op;
    
    while (n -- )
    {
        int x;
        cin >> op;
        if (op == "push")
        {
            cin >> x;
            stk[++ top] = x;
        }
        else if (op == "query")
        {
            cout << stk[top] << endl;
        }
        else if (op == "pop")
        {
            top -- ;
        }
        else if (op == "empty")
        {
            if (top == -1)
            {
                cout << "YES"<< endl;
            }
            else 
            {
                cout << "NO" << endl;
            }
        }
    }
}
相关推荐
凡人叶枫23 分钟前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
noipp24 分钟前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
学逆向的1 小时前
C++纯虚函数
开发语言·c++·网络安全
凡人叶枫2 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
坚果派·白晓明3 小时前
【鸿蒙PC】SDL3 移植:AtomCode Skills 4 步速通多媒体库适配
c++·华为·ai编程·harmonyos·atomcode·c/c++三方库
赴生-4 小时前
C++进阶 C++11(下)
开发语言·c++
有点。4 小时前
C++(贪心算法一)
c++·贪心算法
WBluuue5 小时前
数据结构与算法:有序表(二):跳表
数据结构·c++·算法·skiplist
赴生-5 小时前
C++进阶 异常
开发语言·c++
凡人叶枫6 小时前
Effective C++ 条款28:避免使用 handles 指向对象内部
linux·服务器·开发语言·c++·嵌入式开发