算数表达式求值(中缀转后缀方法)

中缀转后缀

  • 简介
  • 中缀转后缀规则
    • 规则代码实现
      • 比较优先级
  • 后缀表达式存到队列中 计算

简介

  1. 中缀表达式就是我们平时看到的表达式: (3+4)*5-6
    这种表达式是给我们人看的,但是计算机看不懂呀?那我们怎么样可以利用计算机求表达式的值呢?
  2. 这时候,我们就引入了一种新的表达式:后缀表达式。
    例如:(3+4)5-6 的后缀表达式就是 34+56-
    我们可以发现后缀表达式的一个特点,就是从左往右,已经体现了表达式中每个部分的优先级了。
    而这,就方便了计算机进行计算,因为计算机对于一个表达式,就是从左往右读的。

中缀转后缀规则

中缀转后缀,要满足以下规则:

 1.遇到操作数:添加到后缀表达式中或直接输出
 2.栈空时:遇到运算符,直接入栈
 3.遇到左括号:将其入栈
 4.遇到右括号:执行出栈操作,输出到后缀表达式,直到弹出的是左括号
 注意:左括号不输出到后缀表达式
 5.遇到其他运算符:弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈
 6.将栈中剩余内容依次弹出后缀表达式

我把他们简便的画了一副图:
算数表达式求值(中缀转后缀方法)_第1张图片

规则代码实现

要中缀转后缀,就要运用到栈的知识,这时候,使用c++会更简便。

		if (str[i] == '(') {
            temp.flag = false;
            temp.op = str[i];
            s.push(temp);
            i++;
        } else if (str[i] == ')') {
            while ( !s.empty() && s.top().op != '(') {
                printf("%c", s.top().op);
                s.pop();
            }
            s.pop();
            i++;
        } else if (str[i] >= '0'&&str[i] <= '9') {
            temp.flag = true;
            temp.num = str[i] - '0';
            i++;
            printf("%d", temp.num);
        } else {
            temp.flag = false;
            while (!s.empty() && GetPriority(s.top().op)>=GetPriority(str[i])){
                printf("%c", s.top().op);
                s.pop();
            }
            temp.op = str[i];
            s.push(temp);
            i++;
        }

比较优先级

在栈中本来存有符号时,我们就要把当前即将入栈的符号,与栈顶符号进行比较:

	switch (symbol) {
        case '(':
            return 1;
        case '+':
        case '-':
            return 3;
        case '*':
        case '/':
            return 5;
        case ')':
            return 6;
        default:
            return -1;
    }

后缀表达式存到队列中 计算

因为要先入先出,所以要用到队列来存储转换过来的后缀表达式。

利用队列的先进先出,可以写下以下计算代码:

void calculator() {
    int a, b;
    node temp;
    while (!s2.empty()) {
        if (s2.top().flag == true) {
            s1.push(s2.top());
        }
        else {
            b = s1.top().num;
            s1.pop();
            a = s1.top().num;
            s1.pop();
            if (s2.top().op == '+') {
                temp.num = a + b;
            } else if (s2.top().op == '-') {
                temp.num = a - b;
            } else if (s2.top().op == '*') {
                temp.num = a * b;
            } else {
                temp.num = a / b;
            }
            temp.flag = true;
            s1.push(temp);
        }
        s2.pop();
    }
}

这样,就完成了,将中缀表达式转后缀表达式,从而求出表达式值的目的。

你可能感兴趣的:(学习笔记)