数据结构和算法

Posted 伊斯电子编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构和算法相关的知识,希望对你有一定的参考价值。

递归

Fibonacci 数列

F(n) = F(n-1)+F(n-2) F(0) = 1, F(1) = 1 跳台阶:有 n 个台阶,每次只能跳⼀步或者两步,问有⼏种⾛法?int F(int n) { if(n==0 || n==1) return 1; return F(n-1) + F(n-2); }

汉罗塔

F(n)+1 = 2(F(n-1)+1) ==> F(n)+1 = 2^(n-1)(F(1)+1) = 2^n F(n) = 2^n-1 int step = 1; void HLT(int n, char A, char B, char C) { // 有 n 个盘⼦在 A 柱⼦上,通过 B,移动到 C if(n>0) { HLT(n-1, A, C, B); printf("%d:%c-->%c\n", step++, A, C); HLT(n-1, B, A, C);  } }

将中缀转后缀

void inFix2PostFix(char* inFix, char* postFix) {// 将⻓度为 len 的中缀表达式 inFix 转换为后缀表达式postFix int j = 0; char c; stack<char> st; //初始化栈 int len = strlen(inFix); for (int i = 0; i < len; i++) { // 扫描中缀表达式 c = inFix[i]; if (c=='+' || c=='-' || c=='*' || c=='/') { // 如果是操作符 while (st.empty() == false && cmpPrecedence(st.top(), c) >= 0) { // 栈不为空 的时候,并且栈顶元素的优先级不⼩于当前操作符的优先级 postFix[j++] = st.top(); // 弹出栈顶元素 st.pop(); }st.push(c); // ⼊栈 } else {postFix[j++] = c; } }while (st.empty() == false) { // 将栈中剩余的字符出栈到后缀表达式中 postFix[j++] = st.top(); st.pop(); }postFix[j++] = '\0'; // 字符串结束标记 }

判断括号匹配

int match(char* str) { // 判断括号字符串 str 是否匹配,如果匹配返回 1,否则返回 0 stack<char> S; // 栈⽤来保存带匹配的左括号 int len = strlen(str); for(int i=0; i<len; i++) { // 扫描字符串 switch(str[i]) { case '(': case '[': S.push(str[i]); break; // 遇到左括号⼊栈 case ')': if(S.empty() || S.top() != '(') return 0; else S.pop(); break// 能够匹配则出栈 case ']': if(S.empty() || S.top() != '[') return 0; else S.pop(); break; // 能够匹配则出栈 } }if(S.empty()) return 1; else return 0; // 有多余的左括号 }



以上是关于数据结构和算法的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的算法复杂度

可以解密加密数据的片段吗?

从搜索文档中查找最小片段的算法?

如何标记从卷积神经网络的分割算法生成的图像片段?

伪代码

C语言100个经典算法源码片段