数据结构
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 评论 -
数据结构题目练习
顺序表的就地逆置编写一个函数,实现顺序表的就地逆置,也就是说利用原表的存储空间将顺序表(a1,a2…an),逆置为(an,an-1…a1)#define MAXSIE 100//静态顺序表的最大空间#include &amp;amp;amp;lt;iostream&amp;amp;amp;gt;#include &amp;amp;amp;lt;stdlib.h&amp;amp;amp;gt;using namespace s原创 2019-03-04 22:02:21 · 3777 阅读 · 2 评论 -
C++STL
强大的模板库——Standard Template LibrarySTL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,ma...原创 2019-03-02 14:25:22 · 196 阅读 · 0 评论