首页 > 其他分享 >基础数据结构(1)

基础数据结构(1)

时间:2024-10-25 13:32:11浏览次数:1  
标签:head idx int tt 基础 ne ++ 数据结构

单链表与双链表的用处

单链表与双链表

单链表

单链表的存储:

单链表的存储

单链表的几种操作

单链表的几种操作

  1. 在表头插入一个数:先将这个数指向head指向的数,再将head指向这个数
  2. 在表中的第k位后面插入一个数:先将这个数指向第k位指向的数,再将第k位指向这个数
  3. 在表中删除一个数:让这个数直接指向下一个数的下一个数

代码实现:

// e是所有数,ne是指针,idx是当前用到那个数,head是头指针
int e[N], ne[N], idx, head;

// 数组初始化
void init()
{
    head = -1, idx = 0;
}

// 在表头插入一个数x
void add_to_head(int x)
{
    e[idx] = x;
    ne[idx] = head;
    head = idx;
    idx ++ ;
}

// 在k后面插入一个数x
void add(int k, int x)
{
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx ++ ;
}

// 删除k后面的数
void remove(int k)
{
    ne[k] = ne[ne[k]];
}

双链表

双链表的存储:

双链表的存储

双链表有头节点和尾节点,0表示头节点,1表示为尾节点,idx从2开始

插入的思想与单链表相似

代码如下:

// l是左节点,r是右节点,idx是当前用到了那个点
int l[N], r[N], idx;

//初始化
void init()
{
    r[0] = 1;
    l[1] = 0;
}

// 在k的后面插入一个数x,若要在k的左边插入,可以看作在l[k]的右边插入
void add(int k, int x)
{
    e[idx] = x;
    r[idx] = r[k];
    l[idx] = k;
    l[r[k]] = idx;
    r[k] = idx;
    idx ++ ;
}

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

栈(先进后出)

栈的示意图

代码如下:

// tt表示栈顶
int stk[N], tt;

// 栈顶插入x
stk[ ++ tt] = x;

// 栈顶弹出
tt -- ;

// 查询栈顶
stk[tt];

// 栈是否为空
if (tt) not empty;
else empty;

队列(先进先出)

队列的示意图

代码如下:

// tt表示队尾,hh表示队头
int q[N], hh, tt=-1;

// 在队尾插入一个x
q[ ++ tt] = x;

// 弹出对头元素
hh ++ ;

// 队头元素, 队尾元素
q[hh], q[tt];

// 队列是否为空
if (tt >= hh) not empty;
else empty;

单调栈

常见的单调栈都应用于一种问题:

给定一个区间,要求求出区间中的每一个数的左边或右边第一个满足某种性质的数

如:求出区间中每一个数左边第一个小于这个数

暴力做法:

#include <iostream>

using namespace std;

const int N = 100010;

int q[N];
int n;

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ ) scanf("%d", q[i]);
    
    for (int i = 0; i < n; i ++ )
        for (int j = i - 1; j >= 0; j -- )
            if (q[j] < q[i])
            {
                cout << q[j] << ' ';
                break;
            }
            else cout << "-1" << ' ';
    
    return 0;

我们发现当i走过的数中,如果有一个数大于它右边的数,那么这个数一定不会被取到

所以我们可以在开始存的时候就一直维护这种性质,用栈来模拟

代码如下:

#include <iostream>

using namespace std;

const int N = 100010;

int n;
int stk[N], tt;

int main()
{
	cin >> n;
	
	for (int i = 0; i < n; i ++ )
	{
		int x;
		cin >> x;
		
		while (tt && stk[tt] >= x) tt -- ;
		if (tt) cout << stk[tt] << ' ';
		else cout << "-1" << ' ';
		
		stk[ ++ tt] = x;
	}
	
	return 0;
}

单调队列

 

标签:head,idx,int,tt,基础,ne,++,数据结构
From: https://www.cnblogs.com/zyrddd/p/16264973.html

相关文章

  • 鸿蒙编程江湖:并发编程基础与鸿蒙中的任务并发
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。并发编程是指在同一时间段内处理多个任......
  • [QT基础系列]按钮QPushButton
    按钮QPushButton属性和方法、案例文本可以获取和设置按钮上显示的文本//获取和设置按钮的文本QStringtext()constvoidsetText(constQString&text)图标可以获取和设置按钮上显示的图标//获取和设置按钮的图标QIconicon()constvoidsetIcon(constQIcon......
  • [QT基础系列]窗口QWidget
    QWidget所有窗口类的基类Qt中有3个窗口的基类:QWidget、QMainWindow、QDialog在创建Qt工程时,会让我们选择继承自哪一个窗口类其中,QMainWindow、QDialog都是继承自QWidge所有控件类的基类Qt中的控件类(按钮、输入框、单选框等)也属于窗口类它们的基类也是QWid......
  • [QT基础系列]标签QLabel
    标签QLabelQLabel是Qt中的标签类,通常用于显示提示性的文本,也可以显示图像文本可以获取和设置按钮上显示的文本//获取和设置显示的文本QStringtext()const;voidsetText(constQString&text);对齐方式用于设置标签中的内容在水平和垂直两个方向上的对齐方式......
  • 真题练习29-Word字处理-全国计算机等级考试一级计算机基础及MS Office应用考试【汪老
    第29组请根据题目要求,完成下列操作:在考生文件夹下打开文档word.docx,按照要求完成下列操作并以该文件名(word.docx)保存文档。1.将文中所有错词“北平”替换为“北京”;设置上、下页边距各为3厘米。2.将标题段文字(“2009年北京市中考招生计划低于10万人”)设置为蓝色(标准色)、三号......
  • 数据结构 - 树,三探之代码实现
    数据结构-树,三探之代码实现 本文介绍了使用数组和链表两种方式实现二叉树,包括初始化、节点操作(如获取、添加、删除)、以及遍历方法(前序、中序、后序、层次遍历)。测试代码已上传至代码库。 书接上回,今天和大家一起动手来自己实现树。相信通过前面的章节学习,大家已经明白树......
  • Linux基础——虚机mysql库覆盖/usr/lib64/libcrypto.so.1.1.1f无法启动
    1、问题描述租户新增数据库mysql,手动覆盖/usr/lib64中的libcrypto.so.1.1.1f库文件,导致主机重启进入救援模式。 2、问题分析i.发现报错poweroff:errorwhileloadingsharedlibraries:libcrypto.so.1.1:cannotopensharedobjectfile:Nosuchfileordirectoryii.检......
  • 基于SpringBoot + Vue的《计算机基础》网上考试系统
    文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言......
  • 【Linux 从基础到进阶】实时性能监控与调优(Prometheus、Grafana)
    实时性能监控与调优(Prometheus、Grafana)在现代化运维中,实时性能监控和调优是保障系统稳定性和高效性的重要手段。通过实时的性能监控,运维人员可以快速发现系统瓶颈、异常负载和潜在的故障隐患。本文将介绍如何使用Prometheus和Grafana进行系统的实时性能监控,并进行性能调优......
  • 数据结构 - 堆
    今天我们将学习新的数据结构-堆。01、定义堆是一种特殊的二叉树,并且满足以下两个特性:(1)堆是一棵完全二叉树;(2)堆中任意一个节点元素值都小于等于(或大于等于)左右子树中所有节点元素值;小根堆,根节点元素永远是最小值,即堆中每个节点元素值都小于等于左右子树中所有节点元素值;大根......