编程题学习

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;
            }
        }
    }
}
相关推荐
_Twink1e12 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
dong_junshuai12 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
雪的季节13 小时前
Multisim14.0的详细中文安装步骤【附安装包】
c++
Persistent的粽子!14 小时前
C++:类与对象(二)
开发语言·c++
蒸蒸yyyyzwd15 小时前
cpp 选手备战秋招学习笔记 day23
c++·求职招聘
.YM.Z15 小时前
C++ STL 容器深度剖析:vector 与 list 的模拟实现及对比
开发语言·c++·vector·list
mengzhi啊16 小时前
QEventLoop loop配合loop.exec();替代while(1)。电脑cpu占用为0,使用while(1)cpu占用率100%
c++·qt
HugoStudio_SWAN17 小时前
洛谷 P1319 / P1320 压缩技术——同一枚硬币的正反面
c++·学习·程序人生·算法
小小晓.17 小时前
C++单例模式万字详解:6种实现演进+线程安全彻底解决+CRTP终极模板
c++·单例模式
j7~18 小时前
【C++11】C++11 新特性全套详解(列表初始化、右值引用、lambda 表达式、function 与 bind 包装器等)
c++·右值引用·lambda表达式·可变参数模板·移动语义·包装器·c++11发展史