数据结构和算法
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; // 有多余的左括号
}
以上是关于数据结构和算法的主要内容,如果未能解决你的问题,请参考以下文章