自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 论坛 (1)
  • 收藏
  • 关注

原创 学习随记三十二——不使用递归完成二叉查找树

不使用递归完成二叉查找树相较于使用递归,不使用递归实现二叉查找树的操作稍显复杂,但是效率要高,其中最复杂的是删除操作。结点声明:typedef struct TreeNode{ElementType data=0;struct TreeNode* Left=nullptr;struct TreeNode* Right=nullptr;}TreeNode;typedef TreeNode* Bintree;使用的函数:1、插入函数:int Insert(Bintree*,ElementTy

2021-04-17 09:47:57 3

原创 学习随记三十一——递归实现二叉查找树

二叉查找树什么是二叉查找树:左子树中的元素都比父节点元素小,右子树中的元素都比父节点中的元素大二叉查找树的基本操作:1、生成一颗空树我选择使用递归来完成,如果传入的地址非空就先递归删除左子树再递归删除右子树;也可以直接生成一个空根。2、查找元素先判断传入的指针是不是空指针,如果非空再进行比较,如果待查找元素比结点元素小则在该结点的左子树中递归查找,大则在右子树中递归查找,相等则返回该结点地址。3、插入元素*4、删除结点5、打印树中元素使用中序输出,先递归输出结点左子树的元素再递归输出右子

2021-04-13 08:47:40 3

原创 学习随记三十——双端队列

双端队列基本原理:就是将双链表运用到队列上整体代码:#include<iostream>typedef struct Queue{ int data; struct Queue* next=nullptr; struct Queue* previous=nullptr;}Queue;typedef struct Linkqueue{ Queue* front=nullptr; Queue* rear=nullptr;}Linkqueue;using namespace

2021-04-06 20:32:09 4

原创 学习随记二十九——使用单链表实现队列

使用单链表实现队列使用单链表实现队列其实和尾插法实现单链表的思路没什么两样,队列和栈其实就是运算受到限制的单链表,尾插法运用在队列中,头插法运用在栈中,现在我才比较深刻的理解了头插法和尾插法的原理和应用并熟练运用。基本思路:其实就是尾插法的变形,声明一个包含两个结点指针的结点,一个指向链表头一个指向链表尾,每次插入元素在表尾,删除元素在表头整体代码#include<iostream>typedef struct Queue{ int data; struct Queue* next

2021-04-06 09:59:38 6

原创 学习随记二十八——循环队列的实现

循环队列的实现基本思路:利用模运算来判断队列的空与满,其他操作与思路与最基本的用数组实现队列一样整体代码:#include<iostream>const int quesize=10;typedef struct Queue{ int data[quesize]={0}; int front=0; int rear=0;}Queue;using namespace std;int Isempty(Queue*); //判队空int Isfull(Queu

2021-04-04 21:55:10 4

原创 学习随记二十七——使用数组实现队列

使用数组实现队列基本思路:队列和栈其实差不多,都是运算受限制的线性表,操作原理类似,一个成员记录队首,一个成员记录队尾,当队首成员等于队尾成员时即队列空,当队尾成员等于数组最大长度减一时即队列满,但这种会造成假溢出,入队元素在队尾,出队元素在队首。整体代码:#include<iostream>const int quesize=100;typedef struct Queue{ int data[quesize]={0}; int front=0; int rear=0; in

2021-04-04 15:24:00 5

原创 学习随记二十六——支持FindMin操作的栈(链栈)

支持FindMin操作的栈(链栈)基本思路:在栈顶指针结构体中包含一个min指针指向最小元素即可整体代码;#include<iostream>typedef struct Stack{ int data; struct Stack* next;}Stack;typedef struct Linkstack{ Stack* top; Stack* min;}Linkstack;using namespace std;int Isempty(Linkstack*);int

2021-04-01 10:05:52 8

原创 学习随记二十五——支持FindMin的栈(顺序栈)

支持FindMin的栈(顺序栈)基本思路:没什么好说的声明一个含有min记录最小值的标志变量,每次入栈时比较下就可以了整体代码:#include<iostream>const int stacksize=100;typedef struct Stack{ int data[stacksize]; int top=-1; int min=data[0];}Stack;using namespace std;int Isempty(Stack*);int Isfull(Sta

2021-04-01 09:20:37 6

原创 学习随记二十四——使用一个数组创建两个栈(方法三)

使用一个数组创建两个栈(方法三)基本思路:将数组的第一、二个单元作为两个栈的栈底,一个栈使用奇数单元,一个栈使用偶数单元,当两个栈的栈顶都触顶时就认为栈满了,说实话这种方法实现还不如直接用数组创建一个栈。整体代码:#include<iostream> //这个程序只考虑了长度为偶数的情况const int stacksize=10;typedef struct Stack{ int data[stacksize]; int top1=0; int top2=1;

2021-03-31 21:11:55 3

原创 学习随记二十三——使用一个数组建立两个栈(方法二)

使用一个数组建立两个栈(方法二)基本思路;两个栈顶从中间分别向两边扩展,当触碰到了两边的边界就认为栈满了,我觉得我使用的第一种用一个数组创建两个栈的方法比这个要好,从两边向中间扩展对资源的利用更好且更灵活。问题;我刚开始在写的时候没有充分考虑到数组越界的问题,经过后面的调试发现的,以后在使用数组时多考虑。整体代码:#include<iostream>const int stacksize=10;typedef struct Stack{ int data[stacksize];

2021-03-31 20:06:40 9

原创 学习随记二十二——用一个数组实现两个栈(方法一)

用一个数组实现两个栈(方法一)基本思路:两个栈的栈底分别在两头,栈顶向中间趋近当栈顶相遇时即说明栈满整体代码;#include<iostream>const int stacksize=10;typedef struct Stack { int data[stacksize]; int top1=-1; int top2=10;}Stack;using namespace std;int Isempty(Stack*); //判栈空int Isfull(St

2021-03-31 16:53:06 2

原创 学习随记二十一——使用链栈完成平衡符号的检测(大,中,小括号)

使用链栈完成平衡符号的检测(大,中,小括号)基本思路与使用顺序栈完成平衡符号的检测一样,不再赘述。整体代码:#include<iostream>typedef struct Stack{ char ch; struct Stack* next;}Stack;typedef struct Linkstack{ Stack* top;}Linkstack;using namespace std;int Isempty(Linkstack*); //判栈空i

2021-03-28 21:18:29 5

原创 学习随记二十——使用顺序栈完成表达式括号(大,中,小)的平衡检测

使用顺序栈完成表达式括号(大,中,小)的平衡检测为什么要使用栈完成:刚开始我想利用标志变量来完成这项工作,后面发现了使用栈完成符号平衡检测的好处,因为封闭符号(如右括号)总是与最近的开放符号匹配(如左括号),所有一旦遇到封闭符号如果栈顶元素不是与之匹配的开放符号则说明这个表达式的符号不平衡,在符号的平衡检测中充分体现了栈这种先进后出表的作用,且利用栈来完成平衡符号的检测的算法时间复杂度是O(1)。**算法:**遇到开放符号(如左括号)则入栈,遇到封闭符号(如右括号)则出栈并检查弹出的符号是否是与这个封闭

2021-03-28 20:50:20 14

原创 学习随记十九——使用链栈将中缀表达式转换成后缀表达式并计算其结果

使用链栈将中缀表达式转换成后缀表达式并计算其结果基本思路我之前的使用顺序栈将中缀表达式转换成后缀表达式与使用链栈计算后缀表达式中有详细讲解,这里不在赘述。整体代码:#include<iostream>using namespace std;typedef struct Stack1{ string stack; struct Stack1* next;}Stack1;typedef struct Linkstack1{ struct Stack1* top;}Linksta

2021-03-28 11:04:21 7

原创 学习随记十八——用链栈将中缀表达式转换成后缀表达式

用链栈将中缀表达式转换成逆波兰表达式基本思想与我的用顺序栈实现将中缀表达式转换成后缀表达式相同,只是将入栈,出栈,判栈空等操作换成链栈的操作整体代码:#include<iostream>typedef struct Stack1{ std::string stack; struct Stack1* next;}Stack1;typedef struct Linkstack1{ struct Stack1* top;}Linkstack1;using namespace st

2021-03-28 10:38:32 7

原创 学习随记十七——使用顺序栈将输入的中缀表达式变成逆波兰表达式并计算结果

使用顺序栈将输入的中缀表达式变成逆波兰表达式并计算结果主要分成两部分,一是将中缀表达式变成逆波兰表达式,二是计算逆波兰表达式,在编写过程中我使用了模板函数和函数重载。基本思路和我之前的用顺序栈计算逆波兰表达式和用顺序栈将中缀表达式转换成逆波兰表达式相同。函数代码:#include<iostream>#include<string>const int stacksize=100;using namespace std;typedef struct Stack{ doub

2021-03-27 15:59:25 12

原创 学习随记十六——使用顺序栈将中缀表达式转换成逆波兰表达式

使用顺序栈将中缀表达式转换成逆波兰表达式基本思路:按序判断表达式,如果是数字输出并加空格区分;如果是操作符先判断栈是不是空的,如果栈是空的先判断待入栈的操作符是不是左括号,是左括号令计算左括号个数的标志变量自加,但不管是不是都将这个操作符入栈;如果栈非空则先比较待入栈操作符与栈顶操作符优先级,如果待入栈的操作符优先级不比栈顶操作符的优先级低则先判断待入栈操作符是不是右括号,若不是右括号则判断这个操作符是不是左括号,是左括号则令计算左括号的标志变量自加,但不管是不是都将这个操作符入栈;若待入栈的操作符是右

2021-03-27 15:10:32 5

原创 学习随记十五——关于链栈的问题

关于链栈的问题我尝试了直接声明一个结点指针来指向栈顶,但是我忽略了函数形参是值传递,就算是指针也是值传递,故用到了二级指针作为函数参数int Push(Linkstack **top,double x){ Linkstack *s=new Linkstack; s->data=x; s->next=*top; //top=&s; 之前的错误写法 *top=s; return 1; }之前的错误写法将新开辟的结点地址赋给指向原指针的指针,只是使得指向原指针的指针指向新

2021-03-25 19:11:51 16

原创 学习随记十四——安装gcc踩的一些坑

安装gcc踩的一些坑在linux中安装gcc只要apt install gcc就可以了,如果安装不了输入 stdo apt update 更新软件源再试

2021-03-25 11:33:55 8

原创 学习随记十三——关于指针的一些误区

关于指针的一些误区刚开始接触c语言时明白了在函数中交换两个变量的值需要用到一级指针,但是我忽略了就算用了一级指针也不过是将指针保存的值复制后传到函数中只是因为指针中保存的是变量的地址值,所有可以通过地址值来修改变量,但是本质上仍然是值的传递,所以在我写用链栈计算后缀表达式的程序时我直接将参数设置为结点指针在入栈时元素其实并没有入栈;int Push(Linkstack*top,double x){ Linkstack *s=new Linkstack; s->data=x; s->ne

2021-03-24 16:16:25 2

原创 学习随记十二——用链栈计算逆波兰表达式

用链栈计算逆波兰表达式基本过程与顺序栈差不多代码;#include<iostream>#include<string>typedef struct Stack{ double data; struct Stack* next;}Stack;typedef struct Linkstack{ struct Stack* top;}Linkstack;using namespace std;int Isempty(Linkstack*);int Push(Li

2021-03-23 14:17:13 6

原创 学习随记十一——用顺序栈计算逆波兰表达式

用顺序栈计算逆波兰表达式我遇到的主要问题:怎么储存表达式以及将表达式中的数字转化成基本数据类型,我看了许多博客尝试过用stringstream的方法,但是每次遇到不知名错误调试求证无果,后找到了c++自带的类型转换函数stod,真的很棒(๑•̀ㅂ•́)و✧。学到的一些知识:后缀表达式的算法,string与基本数据类型间的转换,以及用erase函数清空string变量后缀表达式的算法:遇到数字存入栈中,遇到操作符号弹出两个数字计算后存入栈中直到只剩最后结果代码实现(包括我的之前的错误代码):注:我是

2021-03-21 23:13:36 10

原创 学习随记十——分别用vector数组和链表创建自调整表

分别用vector数组和链表创建自调整表使用vector数组的算法:先根据输入的元素动态创建一个vector数组,然后在其中查找元素若找到记录下标,然后删除这个单元,再新建一个和原数组大小相等的数组,将找到的元素作为新数组的首个元素再将原数组整体拷贝给新数组的除首单元的单元即可使用链表的算法:先根据输入的元素动态的创建一个链表,然后在其中查找元素,若找到则假设储存的数据与待查找元素相同结点为p,使p的前一个结点指向p的下一个结点,p指向头结点指向的结点,再使头结点指向p即可整体代码:

2021-03-20 12:02:36 13 3

转载 linux操作系统指令(超详细)

https://blog.csdn.net/weixin_44895651/article/details/105289038

2021-03-17 19:24:59 29

原创 学习随记九——用数组实现基数排序(lsd)

用数组实现基数排序lsd式——从位数小的开始比较msd式——从位数高的开始比较例子:lsd式从右边开始比较,属于分配式排序,时间复杂度是O(nlogm),每次从右边位开始比较一直到最高位,适合位数小的数比较,总共比较最高位数趟。算法首先找出数组中的最大元素确定最高位数,然后根据有效位数排序直到最高位数,排序即完成。步骤:#include<iostream>void LsdSort(int a[],int length); //使用lsd——基数比较法给数组排序

2021-03-16 20:48:59 13 1

原创 学习随计八——用链表实现多项式相加

用链表实现多项式相加#include<iostream>using namespace std;typedef struct Polynode{ int index; double exp; struct Polynode *next;}Polynode;void createlist(Polynode*);void Sort(Polynode*);Polynode* Add(Polynode*,Polynode*);void Printlist(Polynode*);i

2021-03-06 20:00:00 16 1

原创 学习随记七——单链表的排序

单链表的排序因为要编写用单链表实现多项式相加的程序所以要用到单链表的排序,我最开始想的是用一个指针数组储存链表每个结点的地址,然后可以用冒泡排序或选择排序比较结点的数据域然后交换指针数组存储的结点地址,排完序最后遍历一遍数组改变数组存储的对应指针指向的结点的指向关系,最后调试许久,不知问题出在那里;遂换一种思路,利用冒泡排序比较结点储存的指数大小然后编写一个Swap函数交换结点储存的指数和系数,依然无果;最后我选取了我看的博客中一种非常巧妙的方法,在遇到更好的方法前我打算将这个方法形成我的套路。主要

2021-03-06 16:05:39 22

原创 学习随记六——单链表与双链表交换相邻结点比较

单链表与双链表交换相邻结点比较单链表结点结构体typedef struct Listnode1{ //为单链表设置的结点结构体 int data; struct Listnode1 *next;}Listnode1;双链表结点结构体typedef struct Listnode2{ //为双链表设置的结点结构体 int data; struct Listnode2* next; struct Listnode2* previous;}Listnode2;**##*

2021-02-28 16:41:28 23

原创 学习随记五——string类与字符数组的转换

string是C++标准库类型,用于表示可变长的字符序列。1 字符数组转化为string1.1直接复制或者赋值通过直接复制或者赋值的方式,可以将字符数组转换为string。char ach1[] = “Hello”;string str1(ach1);string str2 = ach1;1.2通过加法运算符或者复合赋值运算符char ach2[] = “World”;str2 += ach2;Char ch[]=”ABCDEFG”String str(ch);//也可string s

2021-02-24 10:55:34 17

原创 学习随记四——关于string的一些知识纠错

string不可以整体直接与单个字符比较但可以和字符串比较toupper不能直接转换string类型变量,因为类型不匹配,可以通过类型转换再使用toupper之类字处理函数

2021-02-23 21:47:52 14

原创 学习随记三——顺序栈和链栈的定义和基本运算

顺序栈和链栈就像是运算受限制的数组和链表

2021-02-15 20:56:02 22

原创 学习随记二——单链表的创建、插入、删除

学习笔记二——单链表的创建、插入、删除头插法最先开辟的结点在尾端(逻辑上的),访问时最后访问,所以输出是逆序的尾插法最先开辟的结点访问时最先访问,所以输出是顺序的可以看完文章再回头看一遍1. 结点结构体的创建typedef struct Listnode{ int data; //数据域 struct Listnode* next; //指针域 }NODE; //方便后续操作2. 操作函数声明head表示头指针NODE* createlist1(); //头插法创建单链表 N

2021-02-10 23:07:01 28

原创 学习随记一——用C语言实现单链表的头插法和尾插法

用c语言实现单链表的头插法和尾插法创建结点结构体——第一部分是数据域----存储数据——第二部分是指针域----连接结点例:typedef struct Listnode{ int data; //数据域 struct Listnode* next; //指针域 }ListNode;封装创建链表的函数ListNode* createlist1(){ //头插法实现链表创建 int i; //存储数据 ListNode *head,*p; //头指针和工作指针 hea

2021-02-09 20:59:21 45

空空如也

二叉查找树的节点删除问题

发表于 2021-04-11 最后回复 2021-04-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除