表达式分类
(1)中缀表达式:<操作数><操作符><操作数>,例如A+B
(2)前缀表达式:<操作符><操作数><操作数>,例如+AB
(3)后缀表达式:<操作数><操作数><操作符>,例如AB+
在计算机中,编译程序一般使用后缀表达式求解表达式的值,所以我们得先了解如何将中缀表达式转换成后缀表达式
中缀表达式转后缀表达式
为了实现各种转换,需要考虑个操作符的优先级:
操作符 | # | ( | *,/,% | +,- | ) |
---|---|---|---|---|---|
isp | 0 | 1 | 5 | 3 | 6 |
icp | 0 | 6 | 4 | 2 | 1 |
isp(in stack priority)称为栈内优先级,icp(in coming priority)栈外优先级
转换算法描述如下:
- 操作符栈初始化,将结束符‘#’进栈,然后读入中缀表达式字符流的首字符ch。
- 重复执行以下步骤,直到ch=‘#’,同时栈顶的操作符也是‘#’,停止循环。
①若ch是操作数直接输出,读入下一个字符ch
②若ch是操作符,判断ch的优先级icp与当前位于栈顶的操作符op的优先级isp
(1)若icp(ch)> isp(op),令ch进栈,读入下一个字符ch
(2)若icp(ch)< isp(op),退栈并输出
(3)若icp(ch)== isp(op),退栈但不输出,若退出的是‘(’号读入下一字符ch。
③算法结束,输出序列即为所需的后缀表达式
void postfix() {
//把中缀表达式转换成后缀表达式,输入结束标志为#,而且#一开始先放在s栈底
SeqStack<char> s1;
char ch = '#';
char ch1, op;
s1.push(ch);
cin.get(ch);
while (s1.IsEmpty() == false)
{
//ch是操作数,直接输出
if (isdigit(ch)) {
cout << ch;
cin.get(ch);
}
else{
//ch是操作符
s1.Top(ch1);
if (isp(ch1) < icp