摘要:
1 vector split(const string& src, const string& sep) { 2 vector tokens; 3 int lastPos = 0, // 上次找到的sep的位置 4 index, 5 sepLen = sep.length(); 6 while ( -1 != (index = src.find(sep, lastPos) )) { 7 // substr(起始位置,字符串长度) 8 tokens.push_back(src.substr(lastP... 阅读全文
摘要:
1 struct Node { 2 int data; 3 Node* left; 4 Node* right; 5 Node(int d) : data(d),left(0),right(0) { 6 } 7 }; 8 9 class Tree { 10 private: 11 Node* root; 12 int count; 13 int recursiveHeight(Node* subTree); 14 void recursivePreOrder(Node* subTree); 15 ... 阅读全文
摘要:
#define MAX_SIZE 20class Stack {private: int count; int capacity; int data[MAX_SIZE];public: Stack(); ~Stack(); void push(const int& value); int top() const; void pop(); int size() const; bool full() const; bool empty() const; void clear();};Stack::Stack() : co... 阅读全文
摘要:
1 struct Node { 2 int data; 3 Node* next; 4 Node(int d, Node* n = NULL) 5 : data(d),next(n) { 6 7 } 8 }; 9 10 class List { 11 public: 12 List(); 13 ~List(); 14 void clear(); 15 bool empty() const; 16 void push_back(const int& value); 17 voi... 阅读全文
摘要:
如果仅仅需要对图进行DFS和BFS遍历,那么最好使用邻接表表示法。因为邻接表表示法中每一个链表里存的是与头节点相邻的所有节点,因此在DFS和BFS的遍历过程中能够很方便的找出相邻的节点。如果要找单源最短路径(Dijkstra算法),那么最好使用邻接矩阵表示法,因为每次找出distance数组中的最短路径后,要更新distance数组,此时需要知道某个节点与其他节点之间的距离,邻接矩阵直接通过下标adjMatrix[v][w]即可获取,而邻接表需要遍历以v为头节点的链表,找到以w为终点的边节点。 阅读全文
摘要:
DFS(深度优先遍历)图中蓝色的是顶点之间的边。从某一个顶点v开始,遍历与其相邻的顶点w0,w1,...,wn,在访问w1之前,先访问w0,并且遍历完w0的所有相邻顶点。DFS是一个递归的过程,有前进和回退。C++代码实现: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100 8 9 char vertex[N];10 // vector在这相当于邻接表的用法!11 vector a[N];12 bool vis[N];13 int n,e;14 ... 阅读全文
摘要:
银行家算法是经典的死锁避免算法,由两个部分构成。所需要的数据结构:(n是系统中的进程数量,m是资源类型的数量)Available:长度为m的向量,表示当前系统各资源的可用数量。Available[j]==k,表示类型为j的资源 ,可用数量为k。Max:nxm的矩阵,表示所有进程对资源的最大需求量。Max[i][j]==k,表示进程Pi对类型为j的资源的最大需求量为k。Allocation:nxm的矩阵,表示当前时刻,进程所占有的资源情况。Allocation[i][j]==k,表示进程Pi当前占有k个j类型的资源。Need:nxm的矩阵,表示进程对资源的申请情况。Need[i][j]==k,表 阅读全文
摘要:
根据算数基本定理,一个合数可以分解成多个素数的乘积。输入:一个正整数输出:它的所有质因数思路 2是最小的素数,所以从2开始,不断地用2去除正整数n,如果可以被除尽,那么输出质因数2,如果除不尽,2加1到3,再用3去除。直到最后n变成1了,则结束循环。 我之前有个顾虑就是在循环时如何保证当前的除数是素数?后来发现因为2是素数,所以如果n能被其他偶数整除,那么首先就会被除数2整除,并且往后我们会判断能否继续被2整除,只有当2除不尽时,除数才会开始递增。质因数分解中有一个规律:首先找出的质因数比后找出的质因数小。C++代码实现:#include int main(){ int T, n; sca.. 阅读全文
摘要:
中学学过的方法是这样的:假设我要把十进制2991转换成十二进制,那么就用12来除2991,余数是十二进制数的最低位,继续用12除之前所得到的的商,余数是十二进制数的第二位,以此类推。直到最后所得商数为0,算法终止。需要注意的是十六进制中,10~15是用英文字母ABCDEF来表示的,这个需要特别处理。C++代码:#include #include #include void mySwap(char& a, char& b) { char temp = a; a = b; b = temp;}// 翻转字符串void reverseStr(char src[]) { int i = 阅读全文
摘要:
这几天一直都在看跟递归有关的内容,于是就顺便复习了一下同样具有递归的分治法思想的归并排序和快排。以前因为一直难以理解递归的思想,导致我理解起快排和归并排序非常的痛苦,所以产生了排斥的心理,现在认真学习了一番发现其实递归的思想并不难理解。归并排序的算法步骤1、将数组A[p, r]等分成两个子数组:A[p, q]和A[q+1, r],其中q = (p+r)/2。2、分别对两个子数组进行归并排序。3、合并两个已有序的子数组。核心步骤是第三步,归并排序就是在经过第三步后使得数组由无序变为有序的,所以我们首先要写出第三步的算法,用一个函数merge来实现。既然是要合并两个数组,那函数的参数就是两个有已有 阅读全文