表达式求值的算法:我们可以使用两个栈(一个用于存储数字,另一个用于存储运算符。)
具体的求值过程如下:
- 创建两个空栈,一个存储数字,一个存储运算符。
- 从左到右扫描表达式中的每个字符。
- 如果当前字符是数字,把它压入数字栈中。
- 如果当前字符是运算符,则进行以下处理: a. 如果运算符栈为空,或者栈顶运算符为左括号 "(" ,则直接把该运算符压入运算符栈中。 b. 否则,比较该运算符与栈顶运算符的优先级: i. 如果该运算符优先级大于栈顶运算符优先级,则把该运算符压入运算符栈中。 ii. 否则,把栈顶运算符弹出,并从数字栈中弹出两个数字进行计算,然后将计算结果压回数字栈中,继续比较当前运算符和新的栈顶运算符的优先级,直到可以把当前运算符压入运算符栈中。
- 如果当前字符是左括号 "(" ,则把它压入运算符栈中。
- 如果当前字符是右括号 ")" ,则进行以下处理: a. 重复弹出运算符栈栈顶的运算符,直到遇到左括号为止。 b. 弹出的运算符依次从数字栈中弹出两个数字进行计算,然后将计算结果压回数字栈中。
- 当表达式扫描完毕后,如果运算符栈不为空,则依次从运算符栈中弹出运算符,从数字栈中弹出两个数字进行计算,然后将计算结果压回数字栈中。
- 最终,在数字栈中只剩下一个数,这个数就是表达式的值。
使用栈时,初始化一般top=-1 ,然后每次push值都s-data[++s->top]=x//data为数组,x为输入的树 ,判断为空就是top=-1; push时要判断是否为满栈
(s->top==maxsize-1顺序栈或者s->top-s->base==maxsize链栈);
pop时需要判断栈是否为空
串的BF算法:
def BF(text, pattern):
n = len(text)
m = len(pattern)
for i in range(n - m + 1):
j = 0
while j < m and text[i+j] == pattern[j]:
j += 1
if j == m:
return i
return -1
串的KMP算法: 只改变字串j的位置,i的值不改变(持续递增),如果没有找到则返回-1
int KMP(char *text, char *pattern) {
int n = strlen(text);
int m = strlen(pattern);
int *next = makeNext(pattern);
int i = 0, j = 0;
while (i < n) {
if (text[i] == pattern[j]) {
i++;
j++;
} else if (j > 0) {
j = next[j-1];
} else {
i++;
}
if (j == m) {
return i - m;
}
}
free(next);
return -1;
}
其中next数组: 实际上返回到KMP的j值为再模式串中的k前找最长公共子串的长度+1;
int *makeNext(char *pattern) {
int m = strlen(pattern);
int *next = (int *)malloc(sizeof(int) * m);
next[0] = 0;
int j = 0;
for (int i = 1; i < m; i++) {
while (j > 0 && pattern[j] != pattern[i]) {
j = next[j-1];
}
if (pattern[j] == pattern[i]) {
j++;
}
next[i] = j;
}
return next;
}