算法思想:遇到左括号入栈,遇到右括号出栈匹配。
bool BracketMatch(char *str) {
SqStack S; InitStack(&S);
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == '(' || str[i] == '[' || str[i] == '{')
Push(&S, str[i]);
else if (str[i] == ')' || str[i] == ']' || str[i] == '}') {
if (StackEmpty(S)) return false;
char top; Pop(&S, &top);
if (str[i] == ')' && top != '(') return false;
if (str[i] == ']' && top != '[') return false;
if (str[i] == '}' && top != '{') return false;
}
}
return StackEmpty(S); // 栈空则匹配成功
}
时间复杂度 O(n),空间复杂度 O(n)。
示例 a + b * c + (d * e + f) * g → 后缀 a b c * + d e * f + g * +。
操作数入栈;遇运算符弹出两个操作数计算后入栈。例 a b c * +($a=1,b=2,c=3$):$2*3=6\to1+6=7$。
操作数栈 + 运算符栈,按优先级出入栈。
递归调用时,系统用函数调用栈保存返回地址、参数、局部变量。可转为显式栈(如斐波那契非递归)。
int Fib(int n) { // 递归
if (n == 0 || n == 1) return n;
return Fib(n-1) + Fib(n-2);
}
int Fib(int n) { // 非递归(迭代)
if (n == 0 || n == 1) return n;
int a = 0, b = 1, c;
for (int i = 2; i <= n; i++) { c = a + b; a = b; b = c; }
return c;
}
void LevelOrder(BiTree T) {
Queue Q; InitQueue(&Q); EnQueue(&Q, T);
while (!QueueEmpty(Q)) {
BiTNode *p; DeQueue(&Q, &p); visit(p);
if (p->lchild) EnQueue(&Q, p->lchild);
if (p->rchild) EnQueue(&Q, p->rchild);
}
}
void BFS(Graph G, int v) {
visit(v); visited[v] = true; EnQueue(&Q, v);
while (!QueueEmpty(Q)) {
DeQueue(&Q, &v);
for (w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w))
if (!visited[w]) { visit(w); visited[w] = true; EnQueue(&Q, w); }
}
}
表达式 A + B * (C - D) - E / F,逐步得到后缀 A B C D - * + E F / -。
后缀 3 4 + 5 × 6 - → $3+4=7\to7\times5=35\to35-6=29$。结果 29。
* / 高于 + -,( 入栈后优先级最低。( 入栈,) 出栈直到 (。↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。