问题一:括号匹配。
bool Match(char a[n])
{
InitStack(S); //初始化栈
int i=0;
while(a[i]!='\0') //未读到串尾时
{
switch(a[i])
{
case '(':push(S,a[i]);break;
case '[':push(S,a[i]);break;
case '{':push(S,a[i]);break;
case ')':
pop(S,e);
if(e!='(') return false;
else break;
case ']':
pop(S,e);
if(e!='[') return false;
else break;
case '}':
pop(S,e);
if(e!='{') return false;
else break;
default: //其它字符情况
return false;
break;
}//switch结束
i++; //判断下一个字符
}//while结束
if(IsEmpty(S)){
printf("匹配\n");
return true;
}
else{
printf("不匹配\n");
return false;
}
}
问题二:表达式问题
(1)中缀表达式A+B*(C-D)
(2)后缀表达式ABCD-*+
如何根据中缀表达式求后缀表达式?
当前扫描元素 | 栈 | 后缀表达式 |
---|---|---|
A | A | |
+ | + | A |
B | + | AB |
* | +* | AB |
( | +*( | AB |
C | +*( | ABC |
- | +*(- | ABC |
D | +*(- | ABCD |
) | ABCD-*+ |
规则:扫描中缀表达式
①若为字符,则加入后缀表达式;
②若为运算符,则
a:’(’,入栈;
b:’)’,依次将运算符弹出,直至’(’,并删除它;
c:其它:优先级高于栈顶运算符优先级,则入栈,否则依次弹出,直至遇到比它低的运算符或’(’。
如何根据后缀表达式求中缀表达式的值?
当前扫描元素 | 类型 | 动作 | 栈 |
---|---|---|---|
A | 操作数 | 入栈 | A |
B | 操作数 | 入栈 | A B |
C | 操作数 | 入栈 | A B C |
D | 操作数 | 入栈 | A B C D |
- | 运算符 | 弹出栈顶两个操作数,计算C-D=R1,R1入栈 | A B R1 |
* | 运算符 | 弹出栈顶两个操作数,计算B*R1=R2,R2入栈 | A R2 |
+ | 运算符 | 弹出栈顶两个操作数,计算A+R2=R3,R3入栈 | R3 |
结果R3=A+B*(C-D)