算術中綴表達式求值(簡單計算器的運算)


  1. 轉化

中綴表達式直接求值實現並不現實,需要轉化成后綴表達式才能求值。

 

  1. 過程
  2. 開兩個棧,一個為符號棧,一個為數字棧,分別執行不同的分支操作。

 

*當遇到左括號時立刻將其壓人棧中,直到遇到右括號時將左右括號之間的符號和數字全部彈出運算。

*遇到一個數字時,將數字壓入數字棧中。

*遇到一個運算符時,將運算符與棧頂運算符比較,有下列四種情況:

  1. 如果當前運算符比棧頂運算符優先級要高,或者為左括號后的第一個運算符,則將其壓入棧中。
  2. 如果它比棧中元素優先級低或小,則彈出棧頂運算符並運算。
  3. 繼續比較,如果他比新的棧頂運算符優先級高,則回到第一步,否則重復2,3步。
  4. 如果掃描到了中綴表達式的末尾,則彈出所有運算符和相應位置的數字進行運算。

(如果碰到兩位數,用標記數組先記錄下來,再在計算中轉化)

3.代碼展示(code.Js

1.兩步分別為操作棧和運算

#include<iostream>
#include<stack>
#include<cstring> 
#include<iomanip>
using namespace std;
char endnumber[100];//數字和字符棧 
char number[100];//兩位數特殊下標 
int z = 0;//下標 
//a,b優先級比較 
bool cmp(char a,char b)
{
   if(a == '*'||a == '/')
   {
        if(b == '*'||b == '/')
        {
            return false;
     }
     else
     {
         return true;
     }
    }    
   else
   {
        return false;
   }
} 
//使用過渡棧存入后綴表達式 
void get_stack(string s)
{
    memset(number,1,sizeof(number));
    stack<char>attitude;
    int l = s.length();
    int i = 0;
    for(i = 0;i < l;i++)
    {
        char t = s[i];
        if(t == '(')
        {
            attitude.push(t);
        }
        else if(t == ')')
        {
            char str1 = attitude.top();
            while(str1 != '(')
            {
                endnumber[z++] = str1;
                attitude.pop();
                str1 =     attitude.top();
            }
            attitude.pop();
        }
        else if(t >= '0'&&t <= '9')
        {
            if(s[i+1] >= '0'&&s[i+1] <= '9')
            {
               number[z] = '0';
               endnumber[z] = s[i];
               z++;
               endnumber[z] = s[i+1];
               z++;
               i++;
            }
            else
            {
                endnumber[z++] = s[i];
            }
        }
        else
        {
            if(attitude.empty())
            {
                attitude.push(t);
            }
            else
            {
                char str2 = attitude.top();
                if(cmp(t,str2) || str2 == '(')
                {
                    attitude.push(t);
                }
                else
                {
                    while(!cmp(t,str2)&&str2 != '('&&!attitude.empty())
                    {
                        attitude.pop();
                        endnumber[z++] = str2;
                        if(!attitude.empty())
                        str2 = attitude.top();
                    }
                    attitude.push(t);
                }
            }
        }
    }
    while(!attitude.empty())
    {
        char str3 = attitude.top();
        endnumber[z++] = str3;
        attitude.pop();
    }
//    for(i = 0;i < z;i++)
//    cout<<endnumber[i]<<" ";
}
//從存儲中調出數字和字符進行計算,轉換成浮點數計算精確值 
 
void get_calculate(string s)
{
    int k = 1;
    stack<float>put_stack;
    if(number[0] == '0')
    {
        put_stack.push(((endnumber[0] - '0')*10+(endnumber[1]-'0'))*1.0);
        k++;    
    }
    else
    put_stack.push(1.0*(endnumber[0] - '0'));
    for(int i = k;i < z;i++)
    {
        char t = endnumber[i];
        if(t >= '0'&&t <= '9')
        {
            if(number[i] == '0')
            {
               put_stack.push(((endnumber[i] - '0')*10+(endnumber[i+1]-'0'))*1.0);
               i++;    
            }
            else
            {
            put_stack.push((t - '0')*1.0);
        }
        }    
        else
        {
            float x = put_stack.top(); 
            put_stack.pop();
            float y = put_stack.top();
            put_stack.pop();
            float tmp; 
            if(t == '+')
            tmp = x+y;
            else if(t == '-')
            tmp = y-x;
            else if(t == '*')
            tmp = x*y;
            else
            tmp = y/x;
            put_stack.push(tmp);
        }
    } 
    cout<<setiosflags(ios::fixed)<<setprecision(2)<<put_stack.top();
}
int main()
{
       string exp_middle;//中綴表達式
       cin>>exp_middle;
    get_stack(exp_middle);
    get_calculate(exp_middle);
    return 0;
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM