这里的形参a =GetTop(OPTR) 从存字符的栈里获取, b=ch ch是从字符缓存区里读的字符
例如输入2+3*2# (当ch读到非数字时才会进入Precede函数,这一点不在细说,不懂的话请仔细阅读,课本上的)``
优先级条件一:
同级运算符,左边的优先运算
if((a=='+'||a=='-')&&(b=='+'||b=='-'))
return '>';
` if((a=='*'||a=='/')&&(b=='*'||b=='/'))
return '>';``
**优先级条件二**
乘除先算,加减后算
if((a=='*'||a=='/')&&(b=='+'||b=='-'))
return '>';
if((a=='+'||a=='-')&&(b=='*'||b=='/'))
return '<';
**优先条件三**
括号处理
1.扫到字符'(' 就进栈 即 b='('时
if(b=='(')//ch扫描到( 就进栈 (返回'<'号时就将a进栈)
return '<';
2.栈头a='(' 扫描b=')' 时
if(a=='('&&b==')')//栈头 ( 与 ch扫描到的) 则相等 则去除 (
return '=';
3.栈头 a='(' b=任何运算符 就进栈
if(a=='('&&b=='+') //括号的判断
return '<';
if(a=='('&&b=='-')
return '<';
if(a=='('&&b=='*')
return '<';
if(a=='('&&b=='/')
return '<';
栈头a=任何运算符 b=')' 就返回'>'
if(a=='+'&&b==')')
return '>';
if(a=='-'&&b==')')
return '>';
if(a=='*'&&b==')')
return '>';
if(a=='/'&&b==')')
return '>';//------------
**优先级条件四**
字符#优先级最小
if(a=='#'&&b=='+') //------------
return '<';
if(a=='#'&&b=='-')
return '<';
if(a=='#'&&b=='*')
return '<';
if(a=='#'&&b=='/')
return '<';
if(a=='+'&&b=='#')
return '>';
if(a=='-'&&b=='#')
return '>';
if(a=='/'&&b=='#')
return '>';
if(a=='*'&&b=='#')//------#的判断
return '>';
**代码总览**
char Precede (char a,char b){//优先级判断 !!!!!!!!!!!
if((a=='+'||a=='-')&&(b=='+'||b=='-'))
return '>';
if((a=='+'||a=='-')&&(b=='*'||b=='/'))
return '<';
if((a=='*'||a=='/')&&(b=='+'||b=='-'))
return '>';
if((a=='*'||a=='/')&&(b=='*'||b=='/'))
return '>';
if(a=='('&&b==')')//栈头 ( 与 ch扫描到的) 则相等 则去除 (
return '=';
if(a=='#'&&b=='+') //------------
return '<';
if(a=='#'&&b=='-')
return '<';
if(a=='#'&&b=='*')
return '<';
if(a=='#'&&b=='/')
return '<';
if(a=='+'&&b=='#')
return '>';
if(a=='-'&&b=='#')
return '>';
if(a=='/'&&b=='#')
return '>';
if(a=='*'&&b=='#')//------#的判断
return '>';
if(b=='(')//ch扫描到( 就进栈
return '<';
if(a=='('&&b=='+') //括号的判断
return '<';
if(a=='('&&b=='-')
return '<';
if(a=='('&&b=='*')
return '<';
if(a=='('&&b=='/')
return '<';
if(a=='+'&&b==')')
return '>';
if(a=='-'&&b==')')
return '>';
if(a=='*'&&b==')')
return '>';
if(a=='/'&&b==')')
return '>';//------------
}