【計算機演算法】 求字首表示式的值

w_1106發表於2020-11-14

【計算機演算法】 求字首表示式的值

算術表示式有字首表示法、中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2+3*(7-4)+8/4的字首表示式是:+ + 2 * 3 - 7 4 / 8 4。請設計程式計算字首表示式的結果值。

輸入格式:

輸入在一行內給出不超過30個字元的字首表示式,只包含+、-、*、/以及運算數,不同物件(運算數、運算子號)之間以空格分隔。

輸出格式:

輸出字首表示式的運算結果,保留小數點後1位,或錯誤資訊ERROR。

輸入樣例:

 +     + 2 * 3 - 7 4 / 8 4

輸出樣例:

13.0

程式碼:

#include <iostream>  
#include <cstdio>  
#include <string>    
#include <stack>  
#include <stdlib.h>  
using namespace std;  
int main()
{  
	stack <double> q;  
    string a[30];  //存字元
    bool error = 0;  //錯誤資訊
    int n = 0;  //字元個數
    while(cin>>a[n++])//讀到檔案結尾自動結束   
	{
	}
    n=n-1;//n是個數,需要減一  
    for(int i = n-1; i>=0; i--)
	{  
        ///如果是符號  
        if(a[i].length() == 1 && (a[i][0]== '+' || a[i][0]=='-' || a[i][0]=='*' || a[i][0]=='/'))
		{  
            if(q.size()<2) 
			{
				error = 1; 
				break;
			}  
            double aa = q.top(); 
			q.pop();  
            double bb = q.top(); 
			q.pop();  
            if(a[i][0]== '+') 
				q.push(aa+bb);  
            else 
				if(a[i][0]== '-') 
					q.push(aa-bb);  
				else 
					if(a[i][0]== '*') 
						q.push((aa*bb));  
					else if(a[i][0]== '/') 
					{  
						if(bb==0)
						{
							error = 1; break;
						} 
						q.push(aa/bb); 
					}  
        }  
        else
		{    
            double x = atof(a[i].c_str());  //c_str() 函式是轉化為字元陣列;atof() 是c中將字元陣列轉化為浮點型資料函式
            q.push(x);  
        }  
    }  
    if(error) 
		printf("ERROR\n");  
    else 
		printf("%.1f\n",q.top());  
    return 0;  
}  

相關文章