摘要:表达式求值是对栈的一个进阶应用,巧妙地运用了栈的特性,创建了两个栈,一个存放数值,一个存放运算符。看懂这个代码,我们就会对栈的理解更进一步。
实际是这个代码是不好写的,我参考了教材相关内容及其他同学的代码后,才理解并写出以下代码。
由于栈的基本操作等已经在前文说过,这里先只展示有关表达式求值的函数
一.代码块
1)判断优先级函数
char priority(char ch1,char ch2)
{
//对于优先级的判定,我在书上找到了一个表。对此用二位数组实现比较方便
//书上是添加一个#号代表表达式结束,这里可以用=号方便理解
int i,j;
char pri[7][7] =
{
// + - * / ( ) =
{
'>','>','<','<','<','>','>'},
{
'>','>','<','<','<','>','>'},
{
'>','>','>','>','<','>','>'},
{
'>','>','>','>','<','>','>'},
{
'<','<','<','<','<','=','\0'},
{
'>','>','>','>','\0','>','>'},
{
'<','<','<','<','<','\0','='},
};
switch (ch1)
{
case '+':
i = 0;
break;
case '-':
i = 1;
break;
case '*':
i = 2;
break;
case '/':
i = 3;
break;
case '(':
i = 4;
break;
case ')':
i = 5;
break;
case '=':
i = 6;
break;
}
switch (ch2)
{
case '+':
j = 0;
break;
case '-':
j = 1;
break;
case '*':
j = 2;
break;
case '/':
j = 3;
break;
case '(':
j = 4;
break;
case ')':
j = 5;
break;
case '=':
j = 6;
break;
}
return pri[i][j];
}
2)判断字符是否为数字
int isDigit(char ch)
{
if(ch >= '0' && ch <= '9')
{
return 1;
}
return 0;
}
3)判断是否为运算符
int isOperator(char ch)
{
switch (ch)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '=':
return 1;