![](https://img-blog.csdnimg.cn/20190916195236684.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
Ryanw丶
.
展开
-
[数据结构]--二叉树的链式表示
#include <iostream>#include <windows.h>using namespace std;typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;// 先序次序输入二叉树中结点的值,创建二叉链表表示的二叉树void createTree(BiTree &T) { char ch; cin >> ch原创 2021-04-22 20:22:07 · 308 阅读 · 0 评论 -
[数据结构]--模式匹配KMP算法
#include <iostream>#include <cstring>using namespace std;#define MAXLEN 255typedef struct { char ch[MAXLEN+1]; // 0号位置不存储字符 int length;}SString;int n[100];bool initSString(SString &s, char *str) { int len = strlen(str); for (i原创 2021-04-11 15:36:50 · 150 阅读 · 0 评论 -
[数据结构]--模式匹配BF算法
算法步骤:利用计数指针i和j指向主串S和模式串T中当前正待比较的字符位置,i初始为pos,j初始为1。两个串未比较到串尾,执行循环操作:s.ch[i]和t.ch[i]比较,若相等,则i和j分别指示串中下一个位置,继续比较后续字符。若不等,指针后退重新开始匹配。如果j>t.length,说明模式T中的每个字符依次和主串S中的一个连续的字符序列相等,则匹配成功,返回和模式t中第一个字符相等在主串中的序号;否则匹配不成功,返回0。#include <iostream>#i原创 2021-04-11 14:12:22 · 340 阅读 · 0 评论 -
[数据结构]--中缀表达式求值
算术表达式求值算术四则运算遵循以下三条原则先乘除,后加减。从左到右。先括号内,后括号外。在运算的每一步,任意两个相继出现的算符op1和算法op2之间存在优先级关系,以下三种关系:op1 < op2 ,op1 > op2,op1 = op2。算法步骤:初始化操作数栈OPND, 操作符栈OPTR,表达式起始符’#'入OPTR。扫描表达式,读一个字符,直至扫描完毕到’#‘结束字符或者OPTR栈顶元素不为’#'时,循环执行以下操作:若ch不是运算符,压入OPND,读下一个字符c原创 2021-04-06 11:20:25 · 2072 阅读 · 0 评论 -
[数据结构]--栈在括号匹配中的应用
算法思想为:初始化一个空栈,顺序读入括号序列。若是左括号,作为一个新的更紧急期待括号压入栈中,原栈顶元素期待急迫性下降一级。若是右括号,将栈顶的最急迫期待元素取出,检测是否与之配对。如不是,终止判断,括号序列不匹配。若是非法字符,终止判断,括号字符序列不匹配。算法结束时,若栈为空,括号序列匹配,否则括号序列不匹配。#include <iostream>#include <cstdio>#include <cstring>using namespace原创 2021-04-06 09:13:05 · 345 阅读 · 0 评论 -
[数据结构]--链队的实现
#include <iostream>using namespace std;typedef struct QNode { int data; struct QNode *next;}QNode, *QueuePtr;typedef struct { QueuePtr front; QueuePtr rear;}LinkQueue;// 初始化bool initQueue(LinkQueue &Q) { Q.front = Q.rear = new QNo原创 2021-04-05 21:11:02 · 124 阅读 · 0 评论 -
[数据结构]--循环队列的顺序表示
#include <iostream>using namespace std;#define MAXSIZE 5typedef struct { int *base; // 存储空间的基指针 int front; // 头指针 int rear; // 尾指针}SqQueue;// 初始化bool initQueue(SqQueue &Q) { Q.base = new int[MAXSIZE]; if (!Q.base) { return false;原创 2021-04-05 20:00:42 · 138 阅读 · 0 评论 -
[数据结构]--链栈的实现
#include <iostream>using namespace std;typedef struct StackNode { int data; struct StackNode *next;}StackNode, *LinkStack;// 初始化bool initStack(LinkStack &S) { S = NULL; return true;}// 销毁bool destroyStack(LinkStack &S) { LinkS原创 2021-04-04 19:48:07 · 404 阅读 · 0 评论 -
[数据结构]--顺序栈的实现
顺序栈的实现:栈底指针始终指向栈底的位置,栈为空时栈顶指针等于栈底指针。栈为满时,栈顶指针-栈底指针=栈容量。栈非空时,栈顶指针永远指向栈顶元素的上一个位置。#include <iostream>using namespace std;#define MAXSIZE 100typedef struct { int *base; // 栈底指针 int *top; // 栈顶指针 int stacksize; // 栈可用最大容量}SqStack;// 初始化bo原创 2021-04-04 16:23:43 · 361 阅读 · 0 评论 -
[数据结构]--单链表的实现
#include <iostream>using namespace std;typedef struct LNode { int data; struct LNode *next;}LNode, *LinkList;// 构造一个空的单链表Lbool initList(LinkList &L) { L = new LNode; if (!L) { return false; } L->next = NULL; return true;}//原创 2021-04-02 21:15:45 · 196 阅读 · 0 评论 -
[数据结构]-顺序表的实现
#include <iostream>using namespace std;#define MAXSIZE 100typedef struct { int *elem; int length;}SqList;// 构造一个空的顺序表bool initList(SqList &L) { L.elem = new int[MAXSIZE]; // 为顺序表分配一个大小为MAXSIZE的数组空间 if (!L.elem) { return false; }原创 2021-04-02 19:42:44 · 138 阅读 · 0 评论 -
[数据结构]算法设计题--栈回文串
问题回文是指从正读反读均相同的字符序列,如“abba”和“abdba"均是回文,但“good”不是回文。试写出一个算法判定给定的字符序列是否回文。(提示:将一半字符入栈)解答/*回文是指从正读反读均相同的字符序列,如“abba”和“abdba"均是回文,但“good”不是回文。试写出一个算法判定给定的字符序列是否回文。(提示:将一半字符入栈)*/#include <iostream>using namespace std;#define MAXSIZE 10000typed原创 2021-03-27 20:29:25 · 498 阅读 · 0 评论 -
[数据结构]算法设计题--数组双栈
问题将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top等于[-1]时该栈为空;当第1号栈的栈顶指针top[1]等于m时,该栈为空。两个栈均从两端向中间增长,试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法函数。双栈数据结构的定义如下:typedef struct { int top[2], bot[2]; // 栈顶和栈底指针 int *V; // 栈数组 int m; // 栈最大可容纳元素个数}DblStack;解答/*将编号原创 2021-03-27 20:28:42 · 2196 阅读 · 0 评论 -
[数据结构]算法设计题--划分子集(快速排序思想)
问题已知由n个正整数构成的集合A={ak}(0<=k<n),将其划分为两个不相交的子集A1和A2,元素个数为n1和n2,A1和A2中元素之和分别为S1和S2。设计一个尽可能高效的划分算法,满足|n1-n2|最小且|s1-s2|最大。要求:给出算法的基本设计思想。分析算法的时间复杂度和空间复杂度。解答算法思想将最小的[n/2]个元素放在A1中,其余的元素放在A2中,划分满足要求。不需要对全部元素进行排序,可以仿照快速排序的思想,基于枢轴将n个整数划分为两个子集。然后将划分后的枢轴原创 2021-03-06 19:09:13 · 4674 阅读 · 0 评论 -
[数据结构]算法设计题--删除数据域相同的结点
问题用单链表保存m个整数,结点的结构为(data,link),且|data|<=n。现要求设计一个时间复杂度尽可能高效的算法,对于链表中data的绝对值相等的结点,仅保留第一次出现的结点而删除其他多余的绝对值相等的结点。例如单链表为head->21->-15->-15->-7->15,删除后为head->21->-15->-7给出算法的基本设计思想说明算法的时间复杂度和空间复杂度解答算法思想题目要求设计一个时间复杂度尽可能高效的算法,原创 2021-03-05 18:09:38 · 704 阅读 · 0 评论 -
[数据结构]算法设计题--寻找主元素
问题已知一个整数序列A=(a0,a1,…,an-1),其中0<=ai<n(0<=i<n)。若存在ap1=ap2=ap3=apm=x其m>n/2,则称x为A的主元素。例如有A=(0,5,5,3,5,7,5,5),则5位主元素;又如A=(0,5,5,3,5,1,5,7),A中没有主元素。假设A中的n个元素保存在一个一维数组中,请设计尽可能高效的算法,找出A的主元素。若存在主元素,则输出主元素;否则输出-1。要求:给出算法的基本设计思想说明设计的算法的时间复杂度和空间复杂原创 2021-03-05 16:50:18 · 4702 阅读 · 3 评论 -
[数据结构]算法设计题--链表后缀共同空间
问题采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可以共享相同的后缀存储空间。例如,“loading”和“being”的存储空间影像如图。设str1和str2分别指向两个单词所在链表的头结点,链表结点结构为(data,next),请设计一个时间上尽可能高效的算法,找出由str1和str2所指的两个链表共同后缀的起始位置。要求:给出算法的基本设计思想说明算法的时间复杂度。解答算法思想因为两个链表长度不一定相同,所以从头开始同时遍历到尾结点,并不能保证同时到达。假设一个链表比另原创 2021-03-02 10:42:38 · 1320 阅读 · 6 评论 -
[数据结构]算法设计题--数组循环左移
问题设将n个整数存放到一维数组R中。试设计一个在时间和空间两方面尽可能高效的算,将R中保存的序列循环左移动p个位置,即将R中的数据由(x0,x1,x2,…xn-1)变换为(xp,xp+1,…xn-1,x0,…xp)。要求:给出算法的基本设计思想说明算法的时间复杂度和空间复杂度。解答算法思想先将n个数据原地逆置,得到xn-1, xn-2,…xp, xp-1,…x0。然后再将n-p个数据和后面p个数据分别逆置,得到最终结果。算法分析时间复杂度O(n),空间复杂度O(1)。/*设将n个整数原创 2021-03-01 16:04:33 · 1511 阅读 · 0 评论 -
[数据结构]算法设计题--查找链表倒数第k个元素
问题已知一个带有表头结点的单链表,结点结构为(data, link),假设该链表只给出了头指针。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点。若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0。要求:描述算法的基本设计思想。描述算法的详细实现步骤。解答算法思想定义指针p和q,初始化均指向单链表的首元结点。首先将p沿链表移动到第k个结点,而q保持不动,这样当p移动到第k+1个结点时,p和q所指的结点间隔距离k。也就是快慢指针。然后p和q同原创 2021-03-01 13:48:38 · 2046 阅读 · 0 评论 -
[数据结构]算法设计题--删除连续序列链表元素
问题设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素。解答找到小于等于mink的结点和大于等于maxk的结点,进行连接即可。/*设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素。*/#include <iostream>using namespace std;typedef struct LNode { int data; struct LNode *next;}LNode, *LinkList;void createLis原创 2021-03-01 12:38:55 · 457 阅读 · 0 评论 -
[数据结构]算法设计题--原地翻转链表
题目设计一个算法,将链表中的所有结点链接方向“原地”逆转,及要求仅利用原表的存储空间,话句话说要求空间复杂度为O(1)。解答不能开辟新的空间,只能改变指针的指向。因此,可以考虑逐个摘取结点,利用前插法创建链表的思想,依次插入头结点的后面,先插入的为表尾,最后插入的为表头。利用前插法的元素性质,实现了链表原地翻转。/*设计一个算法,将链表中的所有结点链接方向“原地”逆转,及要求仅利用原表的存储空间,话句话说要求空间复杂度为O(1)。*/#include <iostream>usin原创 2021-02-20 21:20:30 · 1281 阅读 · 0 评论 -
[数据结构]算法设计题--查找最大数据域
题目设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结点,返回该结点的数据域。解答O(n)查找最大数据域,遍历即可。初始时pmax指向链表的首元结点,用pmax依次和后面的结点进行比较,发现较大者更新pmax,从头到尾遍历一遍,pmax->data为链表的最大数据域。/*设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结点,返回该结点的数据域。*/#include <iostream>using namespace std;typedef struct原创 2021-02-20 20:58:15 · 1382 阅读 · 0 评论 -
[数据结构]算法设计题--拆分链表
题目设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B和C,其中B表的结点为A表中值小于零的结点,而C表中的结点为A表中值大于零的结点。(链表A中的元素为非零整数,要求B、C表利用A表的结点。)解答链表B使用链表A的头结点,链表C申请一个新的头结点。对链表A进行遍历的同时进行拆解,可以使用前插法或者后插法。/*设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B和C,其中B表的结点为A表中值小于零的结点,而C表中的结点为A表中值大于零的结点。(链表A中的元素为非零整原创 2021-02-20 20:46:22 · 1820 阅读 · 0 评论 -
[数据结构]算法设计题--合并有序链表4
题目已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(A出现而不在B出现的元素所构成的集合),并以同样的形式存储,同时返回集合的元素个数。题解求A和B的交集(A出现而B不出现的元素集合),因为是递增序列。设pa和pb分别指向链表A和链表B的首元结点,我们进行比较:如果pa->data < pb->data。说明pa->data不会在链表B中出现,为交集元素,加入集合,pa指针后移。如果pa->data == pb->dat原创 2021-02-20 12:26:38 · 432 阅读 · 0 评论 -
[数据结构]算法设计题--合并有序链表3
题目已知两个链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A和B的交集,并存放在A链表中。题解取出工作指针pa和pb分别指向链表A和B的首元结点,进行pa和pb比较:(如果数据相等则同时存在,为交集元素。如果比较小于,则不可能为交集元素后移删除。)pa指针的数据等于pb指针的数据。Lc指向pa,pa、pb后移,删除pb。pa指针的数据小于pb指针的数据。pa后移,删除pa。pa指针的数据大于pb指针的数据。pb后移,删除pb。当其中一个指针到达链表尾部,将另一个链表原创 2021-02-20 08:41:16 · 286 阅读 · 0 评论 -
[数据结构]算法设计题--合并有序链表2
题目要求将两个非递减的有序链表合并成一个非递增的有序链表。要求链表仍使用原来两个链表的存储空间,不另外使用其他的存储空间,表中运行有重复的元素。题解与合并有序链表1类似的思路,通过更改结点的指针域来重新建立元素之间的线性关系,得到新链表。有两个关键点:合并的链表与原链表顺序相反,利用前插法建立链表,形成递减序列。当一个表到达表尾为空时,另一个非空表的剩余元素应该利用前插法依次插入Lc的头结点之后,而不能全部链接在Lc表的最后。/*将两个非递减的有序链表合并成一个非递增的有序链表。要求链表原创 2021-02-15 21:23:33 · 750 阅读 · 0 评论 -
[数据结构]算法设计题--合并有序链表
题目要求将两个递增的有序顺序表合并成一个递增的有序链表,要求结果链表使用原来的存储空间,不占用额外的存储空间,表中不允许有其他重复的数据。解答假定创建链表输入的数据有序。为了保证新表和原来一样有序,可以利用后插法建立单链表。假定待合并的链表为L1,L2,合并后的新表使用头指针L3(L3的头结点执行L1的头结点),p1和p2是工作指针,指向L1,L2的首元结点,从首元结点开始比较,去较小数据域的指针插在L3头结点的next域后,形成新链表。/*将两个递增的有序顺序表合并成一个递增的有序链表,要求结原创 2021-02-10 20:01:32 · 1082 阅读 · 0 评论 -
UVA-136 丑数 优先队列
只包含质因数2, 3, 5的数称为丑数,1是第一个丑数。将1放入优先队列,模拟生成未重复的丑数放入优先队列,小的丑数优先取出。#include <cstdio>#include <queue>#include <vector>#include <set>using namespace std;typedef long long LL;const int coeff[3] = {2, 3, 5};struct cmp { bool op原创 2020-11-07 20:39:09 · 173 阅读 · 0 评论 -
UVA-540 队列中的队列 queue
维护一个队列,队列的元素是一个队列。我们定义队列元素为短队,队列为长队。长队的元素是短队的索引,短队的元素是队员号。#include <cstdio>#include <iostream>#include <map>#include <queue>using namespace std;const int MAXN = 1e3 + 10;int main() { int n; int cnt = 0; while (~sc原创 2020-11-07 20:14:43 · 138 阅读 · 0 评论 -
UVA-12096 集合栈 map+stack+set
UVA-12096栈中的元素是集合的集合,把每个集合映射一个ID,由于元素是集合的集合,每个集合又能看作是ID的集合。栈中存放ID,在vector中根据ID取到相应的集合,集合里存放的是子元素集合的ID。每一个ID对应一种唯一的集合类型。#include <algorithm>#include <iostream>#include <cstdio>#include <vector>#include <map>#include <原创 2020-11-06 19:25:02 · 100 阅读 · 0 评论 -
UVA-156 单词频率 Map
记录所有单词重组后仍只出现过一次的单词。#include <cstdio>#include <vector>#include <string>#include <cstring>#include <map>#include <iostream>#include <algorithm>using namespace std;vector<string> words;map<string,原创 2020-11-06 18:20:21 · 133 阅读 · 0 评论 -
UVA-10815 单词+Set
字符串分割单词+set插入元素从小大排序,string类型已经定义’<‘运算符。#include <cstdio>#include <cstring>#include <set>#include <string>#include <iostream>using namespace std;const int MAXN = 200 + 10;char s[MAXN];int main() { set<string>原创 2020-11-05 18:50:26 · 125 阅读 · 0 评论 -
UVA-10474 STL的使用
lower_bound(begin, end, num)函数返回第一个大于或等于num的指针,如果不存在返回end,使用int pos = lower_bound(begin, end, num) - begin;可以查找大于或等于num的第一个位置。#include <cstdio>#include <algorithm>using namespace std;const int MAXN = 1e4 + 10;int main() { int n, q, x, a[M原创 2020-11-05 17:11:04 · 130 阅读 · 0 评论 -
排列算法
1 ~ n的字典序排列利用递归的思想,先生成1的排列,直到n的排列。print_permutation(序列 A, 集合 S)。A为已排序列,S为剩余元素集合。如果S集合为空,输出A序列。如果S集合不为空,将S按序的第一个元素加入序列A,调用自身进行递归。#include <cstdio>#include <vector>#include <algorithm>using namespace std;void print_permutation(i原创 2020-10-15 19:21:58 · 263 阅读 · 0 评论 -
牛客网NC105 二分查找
NC105请实现有重复数字的有序数组的二分查找。输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。二分答案模板题,区间中满足条件的最小值。class Solution {public: /** * 二分查找 * @param n int整型 数组长度 * @param v int整型 查找值 * @param a int整型vector 有序数组 * @return int整型 */ i原创 2020-10-10 11:00:18 · 308 阅读 · 0 评论 -
HDU 4190 二分答案
把B个投票箱分配到n个城市,每个城市至少一个投票箱,投票箱的容量最小是多少?求二分区间中满足条件的最小值。#include <cstdio>#include <cmath>#include <algorithm>using namespace std;const int MAXN = 2e6 + 10;int a[MAXN];int n, b;bool check(int mid) { int num = 0; for (int i = 0; i &原创 2020-10-07 22:06:11 · 253 阅读 · 0 评论 -
POJ-2456 二分答案
在n个点中选c个点使得相邻的点之间的最小距离最大,求最大值。求二分区间中满足条件的最大值。二分区间为(0,数组中最大差距),如果mid满足题意那么比mid小的答案也满足题意。#include <cstdio>#include <algorithm>using namespace std;const int MAXN = 1e5 + 10;int a[MAXN];int n, c;bool check(int mid) { int x = a[0]; int nu原创 2020-10-07 19:42:04 · 316 阅读 · 0 评论 -
循环队列代码模板
/*循环队列,head和tail指针超出数组范围之后重置为0,循环队列head和tail之间至少有一个空位。*/#include <iostream>using namespace std;const int MAXN = 5;int q[MAXN];int head, tail;// 初始化void initialize() { head = tail = 0;}// 判满bool isFull() { return head == (tail + 1) % MAX原创 2020-10-05 18:03:20 · 156 阅读 · 0 评论 -
C++对象存储空间探讨
对象的存储空间一个对象要占用多大的内存空间,权威结论是:非静态成员变量总和加上编译器为CPU数据对齐和支持虚函数所产生的负担的总和。#include <iostream>using namespace std;class Box {};int main() { Box boxobj; cout << sizeof(boxobj) << endl; return 0;}程序执行结果为1空类型对象中不包含任何信息,但是创建对象时必须在内存中占用原创 2020-10-01 19:46:35 · 544 阅读 · 0 评论 -
冒泡法排序初探
冒泡排序思路:让数组中的元素像水中的气泡一样上浮,进而达到排序的目的。重复以下步骤,直到数组中不包含顺序相反的相邻元素从数组末尾开始依次比较相邻两个元素,如果大小关系相反则交换位置复杂度分析时间复杂度:O(n2)空间复杂度:O(1)冒泡排序进交换数组中的相邻元素进行比较和交换,因此不会改变元素的相对位置,是一种稳定的排序算法。冒泡排序中的交换次数称为反序数或逆序数,用于体现数列的错乱程度。#include <iostream>using namespace std原创 2020-09-28 17:22:57 · 95 阅读 · 0 评论