中綴表示式求值 ,中綴表達轉化為字尾表示式求值,

2022-03-14 05:22:40 字數 3054 閱讀 3428

中綴表示式求值

中綴表示式就是我們平常所見的數學式子   :5+3    6+5*8   -3*(1-9) 等等  

這類表示式的特點就是運算子與運算元有特定的規則  如"+"    加數+加數 、 『-』    被減數 -減數 等等  一般來說運算子在運算元中間

這類表示式我們可以直接計算 ,但計算機計算卻有些麻煩了

所以我們必須設計乙個合適有效的演算法來讓計算機計算這些表示式

一種方式是  運用兩個棧 乙個儲存操作符稱為optr_stack  另乙個儲存運算元稱為opan_stack

規則:依次讀入 c

1.c是運算元 則壓入運算元棧.。

2.若c是操作符且 是非『)』和『(』的操作符 ,將c與操作符棧中棧頂的操作符比較優先順序

(1)若優先順序   棧頂 <=c  則將c壓入運算子棧中。

(2)若優先順序   棧頂 >  c   則將棧頂運算子彈出 並將運算數棧 中彈出兩個字元  計算並將結果壓入運算子棧,直至遇到左括號或者遇到滿足(1)條件  把c 壓入運算子棧中。

3.若是'(』  壓入棧中。

4. 若c是『')' 則將運算子棧 中棧頂的操作符彈出,並將運算數棧 中彈出兩個字元   計算並將結果壓入運算子棧,直至遇到'(',將'('中棧中刪除 開始讀取下一字元。

5.若到字串結束 則將運算子棧頂的操作符彈出 ,並將運算數棧 中彈出兩個字元   計算並將結果壓入運算子棧,直至棧空

原理就是如果這個操作符優先順序低的話 先計算前面優先順序高的

比如計算 6*5+3   當讀入6 *5後 讀入+ 必須要將前面運算子級別高的'*'計算得出6*5=30 才能將後面的30與3相加。

**如下

/*

中綴表示式求值

*/#include#include#include#include#include#include#define error 0x7f7f7f7f

using namespace std;

const int maxn=1100;

int priority(char c)//運算子的優先順序

void preprocess(char *str,const char *s)//預處理將字串轉化為正數加減乘除

str[top]=0;

}double calcu(double num1,double num2,char c)//計算

return res;

}double getmidexpreval(const char *s)//將中綴表示式轉化為字尾表示式

opan.push(dble);

}else if(*user_read=='(')

optr.push(*user_read++);

else if(*user_read==')')

optr.pop();

user_read++;

}else

char now_optr=optr.top();

if(priority(*user_read)>priority(now_optr))

optr.push(*user_read++);

else}}

while(!optr.empty())

return opan.top();

}int main()

}

另一種方式就是:將中綴表示式轉化為字首表示式或者字尾表示式

字首表示式  運算子在運算元前面  6+5            字首表示式為+ 6 5

字尾表示式  運算子在運算元後面 3*5              字尾表示式    3 5 *

轉化成字首 或者字尾表示式的方便之處就是不用考慮運算子的優先順序問題 

轉化為字尾表示式的過程其實就是上面利用中綴表示式求值的過程 

過程不在描述   可以戳這裡

**:/*

中綴表示式轉換為字尾表示式

*/#include#include#include#include#include#include#define error 0x7f7f7f7f

using namespace std;

const int maxn=1100;

int priority(char c)//運算子的優先順序

void preprocess(char *str,const char *s)//預處理將字串轉化為正數加減乘除

str[top]=0;

}void mid_tobehexpress(char *str,const char *s)//將中綴表示式轉化為字尾表示式

*str++=' ';

}else if(*user_read=='(')

optr.push(*user_read++);

else if(*user_read==')')

optr.pop();

user_read++;

}else

char now_optr=optr.top();

if(priority(*user_read)>priority(now_optr))

optr.push(*user_read++);

else}}

while(!optr.empty())

*str='\0';

}int main()

{ int t;

char s[maxn],str[maxn];

scanf("%d",&t);

while(t--)

{scanf("%s",s);

preprocess(str,s);

mid_tobehexpress(s,str);

cout<計算中綴表示式有乙個細節是乙個'-'   怎麼判斷出他是符號還是減號

當時看了乙個部落格覺得很好 

但是對於-(-8)這樣的式子就處理不了  

今天無意間用win10的計算器  突然發現 如果你輸入-8 他會自動在前面加乙個0 變為0-8

這樣就把負數轉化為 兩個正數的加減法了

中綴表示式轉化為字尾表示式

注意 中綴表示式需要空格隔開運算元或者操作符 關鍵有 判斷是否操作符,操作符優先順序 public class profixexpression 計算排好的字尾操作計算式 param prostr return public static intprofixcalculate string pros...

中綴表示式轉化為字尾表示式

中綴表示式轉化為字尾表示式有兩種方法,一種是利用棧,一種是把表示式轉化為樹再進一步求解,今天我們來深入了解一下這兩種方法 給出下面乙個例子 我們把中綴表示式 9 3 1 3 10 2 轉化為字尾表示式 1.首先初始化乙個空棧,用來對符號進出棧使用 2.第乙個字元是數字9,輸出9,將後面的符號 進棧 ...

中綴表示式轉化為字尾表示式

中綴表示式轉化為字尾表示式 例如 1 2 3 4 7 5 123 4 75 1 遇到數字輸出,否則進棧。2 遇到有右括號匹配棧裡的左括號,輸出棧裡的內容 3 遇到比自己比棧裡的運算子優先順序高,入棧 4 遇到比自己比棧裡的運算子優先順序低,將棧裡的運算子出棧 include include incl...