当前位置 博文首页 > 广大菜鸟的博客:算法学习(5) 数据结构:用数组实现单链表/栈/队

    广大菜鸟的博客:算法学习(5) 数据结构:用数组实现单链表/栈/队

    作者:[db:作者] 时间:2021-09-16 22:26

    1、数组模拟单链表

    例题:826. 单链表

    https://www.acwing.com/problem/content/828/
    在这里插入图片描述

    输入样例:
    10
    H 9
    I 1 1
    D 1
    D 0
    H 6
    I 3 6
    I 4 5
    I 4 5
    I 3 4
    D 6
    输出样例:
    6 4 6 5
    
    #include<iostream>
    using namespace std;
    
    const int N = 100010;
    
    // head 头结点下标,e[i]表示结点i的值
    // ne[i]表示下一个结点的下标,idx表示当前已经用到了哪个点
    int head, e[N], ne[N],idx=0;
    
    //初始化
    void init() {
    	head = -1;
    	idx = 0;
    }
    
    // 插入头节点  “H x”,表示向链表头插入一个数x。
    void add_to_head(int x) {
    	e[idx] = x;
    	ne[idx] = head;
    	head = idx;
    	idx++;
    }
    
    
    // 插入指定结点后 “I k x”,表示在第k个输入的数后面插入一个数x(此操作中k均大于0)。
    void insert(int k, int x) {
    	e[idx] = x;
    	ne[idx] = ne[k];
    	ne[k] = idx;
    	idx++;
    }
    
    // 删除k结点后一个点, “D k”,表示删除第k个输入的数后面的数(当k为0时,表示删除头结点)。
    void remove(int k) {
    	ne[k] = ne[ne[k]];
    }
    
    int main() {
    	init();
    	int m;
    	cin >> m;
    	while (m--) {
    		char a;
    		int k, x;
    		cin >> a;
    		if (a == 'H') {
    			cin >> x;
    			add_to_head(x);
    		}
    		else if (a == 'I') {
    			cin >> k >> x;
    			insert(k-1, x);
    		}
    		else {
    			cin >> x;
    			if (!x)
    				head = ne[head];
    			remove(x-1);
    		}
    	}
    	for (int i = head; i != -1; i = ne[i])
    		cout << e[i] << " ";
    }
    
    
    

    例题:827. 双链表

    在这里插入图片描述

    数据范围
    1≤M≤100000
    所有操作保证合法。
    
    输入样例:
    10
    R 7
    D 1
    L 3
    IL 2 10
    D 3
    IL 2 7
    L 8
    R 9
    IL 4 7
    IR 2 2
    输出样例:
    8 7 7 3 2 9
    
    #include<iostream>
    using namespace std;
    
    const int N = 100010;
    
    // head 头结点下标,e[i]表示结点i的值
    // ne[i]表示下一个结点的下标,idx表示当前已经用到了哪个点
    int head, e[N], l[N],r[N],idx=0;
    
    // 初始化
    void init() {
    	// 0 表示左端点,1表示右端点
    	r[0] = 1, l[1] = 0;
    	idx = 2;
    }
    
    // 第k个点右边插入一个点
    void IR(int k, int x) {
    	e[idx] = x;
    
    	r[idx] = r[k];
    	l[idx] = k;
    
    	l[r[k]] = idx;
    	r[k] = idx;
    	idx++;
    }
    
    // 第k个点左边插入一个点
    void IL(int k, int x) {
    	e[idx] = x;
    
    	l[idx] = l[k];
    	r[idx] = k;
    
    	r[l[k]] = idx;
    	l[k] = idx;
    	idx++;
    }
    
    // 删除第k个结点
    void remove(int k) {
    	r[l[k]] = r[k];
    	l[r[k]] = l[k];
    }
    
    //  “L x”,表示在链表的最左端插入数x。
    void L(int x) {
    	e[idx] = x;
    
    	l[idx] = 0;
    	r[idx] = r[0];
    
    	r[0] = idx;
    	l[r[idx]] = idx;
    
    	idx++;
    }
    
    //“R x”,表示在链表的最右端插入数x。
    void R(int x) {
    	e[idx] = x;
    
    	r[idx] = 1;
    	l[idx] = l[1];
    	
    	r[l[idx]] = idx;
    	l[1] = idx;
    
    	idx++;
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	init();
    	int m; cin >> m;
    	string opt; 
    	int k, x;
    	while (m--) {
    		cin >> opt;
    		if(opt== "L"){
    			cin >> x;
    			L(x);
    		}
    		else if (opt == "R") {
    			cin >> x;
    			R(x);
    		}
    		else if (opt == "D") {
    			cin >> k;
    			remove(k+1);
    		}
    		else if (opt == "IL") {
    			cin >> k >> x;
    			IL(k+1, x);
    		}
    		else if (opt == "IR") {
    			cin >> k >> x;
    			IR(k+1, x);
    		}
    	}
    	for (int i = r[0]; i != 1; i = r[i]) {
    		cout << e[i] << " ";
    	}
    }
    /*
    (1) “L x”,表示在链表的最左端插入数x。
    
    (2) “R x”,表示在链表的最右端插入数x。
    
    (3) “D k”,表示将第k个插入的数删除。
    
    (4) “IL k x”,表示在第k个插入的数左侧插入一个数。
    
    (5) “IR k x”,表示在第k个插入的数右侧插入一个数。
    
    输入样例:
    10
    R 7
    D 1
    L 3
    IL 2 10
    D 3
    IL 2 7
    L 8
    R 9
    IL 4 7
    IR 2 2
    输出样例:
    8 7 7 3 2 9
    */
    

    2、数组模拟栈

    #include<iostream>
    using namespace std;
    const int N = 10010;
    int stk[N], stt=0;
    
    //=========  栈 ==================
    
    // 插入
    void push(int x) {
    	stk[++stt] = x;
    }
    
    // 弹出
    void pop() {
    	stt--;
    }
    
    //判断是否为空
    bool isempty() {
    	return stt > 0;
    }
    
    //栈顶
    int top() {
    	return stk[stt];
    }
    
    

    3、数组模拟队列

    #include<iostream>
    using namespace std;
    const int N = 10010;
    
    int q[N], hh, tt = -1;
    
    // 插入
    void push(int x) {
    	q[++tt] =