1. 程式人生 > >中綴表達式求值

中綴表達式求值

while 兩個 clas sin out using HA 查表 pop

  利用棧求中綴表達式的值.

  它的要點是找到運算符的優先級,比如一個式子 3 + (4 + 3 * 5) ,掃到+號是不能算的,它的級別高於‘\0‘(首先給運算符棧壓入一個‘\0‘),掃到左括號也不能算,直到掃到右括號,它之前的 ‘*‘ 是比它優先級高的. 這種運算符優先級要利用一個二維數組,然後查表.

  對於運算符和運算數,要開兩個棧,當掃到運算數時要果斷將其壓棧,掃到運算符時,如果棧頂運算符級別高於它,將進行計算,同時要將運算數棧的頂端兩個數彈出,將計算結果再壓入棧. 如果棧頂運算符級別等於掃到的運算符就說明這兩個運算符可以抵消了,所以將彈出頂端運算符. 如果棧頂運算符級別小於它就要將它壓入運算符棧待用.

#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
char s[260];
int n1 = 0, n2 = 0;
char pri[8][9] =
{
    ">><<<<>>",
    ">><<<<>>",
    ">>>><<>>",
    ">>>><<>>",
    ">>>>><>>",
    "<<<<<<= ",
    "        ",
    "<<<<<< ="
};
int sw(char s)
{
    if (s == ‘+‘) return 0;
    else if (s == ‘-‘) return 1;
    else if (s == ‘*‘) return 2;
    else if (s == ‘/‘) return 3;
    else if (s == ‘^‘) return 4;
    else if (s == ‘(‘) return 5;
    else if (s == ‘)‘) return 6;
    else if (s == ‘\0‘)return 7;
    else return -1;
}
int cal(int n1, char rt, int n2)
{
    if (rt == ‘+‘) return n1 + n2;
    else if (rt == ‘-‘) return n1 - n2;
    else if (rt == ‘*‘) return n1 * n2;
    else if (rt == ‘/‘) return n1 / n2;
    else if (rt == ‘^‘)
    {
        int ans = 1;
        for (int i = 1; i <= n2; i++)
            ans *= n1;
        return ans;
    }
    else return -1;
}
stack <int> opnd;
stack <char> optr;
int main()
{
  
    int result = 0, i = 0;
    optr.push(‘\0‘);
    cin >> s;

    while (!optr.empty())
    {
        char c = s[i];
        if (isdigit(c))
        {
            opnd.push(c - ‘0‘);
            i++;
        }
        
        else
        {
            char cmp = pri[sw(optr.top())][sw(s[i])];
            if (cmp == ‘<‘)
            {
                optr.push(s[i]);
                i++;
            }
            else if (cmp == ‘=‘)
            {
                optr.pop();
                i++;
            }
            else if (cmp == ‘>‘)
            {
                    n2 = opnd.top() ;
                    opnd.pop();
                    n1 = opnd.top() ;
                    opnd.pop();
                    result = cal(n1, optr.top(), n2);
                    opnd.push(result);
                    optr.pop();
                    
                
            }
        }
    }
    cout << opnd.top() << endl;
    return 0;
    
}

  

  

  

中綴表達式求值