7.3 应用
7.3.1 括号匹配
无论是在计算表达式还是在C++代码中,都会碰到括号匹配问题。如以下的C++代码:
int sumList(int theList[], int size)
{
int sum = 0;
int i = 0;
while(i < size) {
sum += theList[i];
i += 1;
}
return sum;
}
括号匹配问题可以使用栈来解决。当一行一行的检查C++代码时,碰到"{"、“[”、“(”就将其压入栈中,碰到"}”、“]”、“)”就将栈顶弹出,如果括号都能匹配正确,则栈最后会变成空栈。如:
如果括号没有匹配成功,则出现以下情况:
下面是检查C++代码中括号匹配问题的函数
#-*-coding: utf-8-*-
# 栈的应用之一:括号匹配
from lliststack import Stack
def isValidSource(srcfile):
s =Stack()
for line in srcfile:
for token in line:
if token in "{[(":
s.push(token)
elif token in "}[)":
if s.isEmpty():
return False
else:
left = s.pop()
if (token == "}" and left != "{") or (token == "]" and left != "[") or (token == ")" and left != "("):
return False
return s.isEmpty()
7.3.2 表达式的计算
算术表达式有三种表示形式:
- 中缀表示(infix notation):<操作数> <操作符> <操作数>,例如 A + B;
- 前缀表示(prefix notation):<操作符> <操作数> <操作数>,例如 + A B;
- 后缀表示(postfix notation):<操作数> <操作数> <操作符>,例如 A B +。
后缀表示求值算法
使用后缀表示求值,可使用栈来储存操作数或者变量,直到遇到操作符时,将两个操作数弹出,计算值,再压入栈中,直至最后求出表达式的值,如果表达式没有问题,那么在最后的栈中,只会有一个数剩余,即表达式的值。如
如果表达式有问题,如
出现操作数多余的情况。