1.中綴表示式:便於人看
2.字首表示式(波蘭式):運算子在前面,運算數在後面
3.字尾表示式(逆波蘭式):運算數在前面,運算子在後面
中綴- - - ->字首:
優先順序先乘除再加減,入棧方向從右往左,棧外的符號想進棧,棧內的符號想出棧。棧外左括號不能進棧,棧外右括號優先順序最高。棧內右括號優先順序最低。
中綴- - - ->字尾:
簡單規則:優先順序先乘除再加減,入棧方向從左往右,棧外的符號想進棧,棧內的符號想出棧。棧外右括號不能進棧,棧外左括號優先順序最高。棧內左括號優先順序最低。
例題:中綴表示式為3+4*(5-3)/(4-2)
轉換為字首表示式為+3*4/-53-42
轉換為字尾表示式為3453-*42-/+
第一種方法:加括號法
字首:把符號放在本級的括號前
字尾:把符號放在本級的括號後
如中綴表示式加括號後:(3+((4*(5-3))/(4-2)))
把符號放在本級的括號前:+(3/(*(4-(53))-(42)))
去掉括號,字首表示式即:+3/*4-53-42
如中綴表示式加括號後:(3+((4*(5-3))/(4-2)))
把符號放在本級的括號前:(3((4(53)-)*(42)-)/)+
去掉括號,字尾表示式即:3453-*42-/+
第二種方法:堆疊法
c語言**:
中綴- - - - >字首:
//1.先定義巨集,優先順序對應的數字,數字越大,優先順序越低
#define opera_prio_plus_in_front 4 //棧內+
#define opera_prio_minus_in_front 4 //棧內-
#define opera_prio_multiply_in_front 2 //棧內*
#define opera_prio_division_in_front 2 //棧內 /
#define opera_prio_right_brackets_in_front 10 //棧內 ) //棧內時右括號優先順序最低
//左括號不能進棧
#define opera_prio_plus_out_front 5 //棧外+
#define opera_prio_minus_out_front 5 //棧外-
#define opera_prio_multiply_out_front 3 //棧外*
#define opera_prio_division_out_front 3 //棧外 /
#define opera_prio_left_brackets_out_front 10 //棧外( //棧外時左括號優先順序最低
#define opera_prio_right_brackets_out_front 1 //棧外) //棧外時右括號優先順序最高
#define opera_prio_err_front -1 //
//字首
//2.利用巨集得出每個運算子的優先順序代表的數字,便於比較
int priority_midtofirst(char opera, bool instack)
}else
//false 棧外
}return prio;
}//3.把中綴表示式改為字首表示式
int midtofirst(char *last,const
char *mid)
else
//運算子
else
//棧不空,比較優先順序
else
if(prioout > prioin)//棧外優先順序低
else
//優先順序相等,()匹配,直接刪除}}
}last[i++]=*mid;//中綴表示式第乙個運算元一定是數字
while(!isempty(&s))
last[i]='\0';//字串以『\0』結尾
return i;//返回last元素個數
}//4、測試
int main()
printf("mid:%s\nlast:%s\n",mid,last);
return
0;}
中綴- - - - >字尾:
//字尾
//1.定義巨集
#define opera_prio_plus_in_back 4 //棧內+
#define opera_prio_minus_in_back 4 //棧內-
#define opera_prio_multiply_in_back 2 //棧內*
#define opera_prio_division_in_back 2 //棧內 /
#define opera_prio_left_brackets_in_back 10 //棧內 ( //棧內時左括號優先順序最低
//右括號不能進棧
#define opera_prio_plus_out_back 5 //棧外+
#define opera_prio_minus_out_back 5 //棧外-
#define opera_prio_multiply_out_back 3 //棧外*
#define opera_prio_division_out_back 3 //棧外 /
#define opera_prio_left_brackets_out_back 1 //棧外( //棧外時左括號優先順序最高
#define opera_prio_right_brackets_out_back 10 //棧外) //棧外時右括號優先順序最低
#define opera_prio_err_back -1 //
//2.利用巨集得出每個運算子的優先順序代表的數字,便於比較
int priority_midtoback(char opera, bool instack)
}else
//false 棧外
}return prio;
}//3.把中綴表示式改為字尾表示式
void midtolast(char *last,const
char *mid)
else
//運算子
else
//棧不空,比較優先順序
else
if(prioout > prioin)//棧外優先順序低
else
//優先順序相等,()匹配,直接刪除}}
}while(!isempty(&s))
last[i]='\0';
}//4、測試
int main()
堆疊方法的**較長,若有更簡潔的**,歡迎指正。 算術表示式的字首,中綴,字尾相互轉換
中綴表示式 中綴記法 中綴表示式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於運算元的中間。中綴表示式是人們常用的算術表示方法。雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。...
字首 中綴 字尾表示式的相互轉換方法
乙個中綴式到其他式子的轉換方法 這裡我給出乙個中綴表示式 a b c d e 第一步 按照運算子的優先順序對所有的運算單位加括號 式子變成 a b c d e 第二步 轉換字首與字尾表示式 把運算符號移動到對應的括號前面 則變成 a b c d e 把括號去掉 a b c d e 字首式子出現 把運...
字首,中綴,字尾表示式轉換
title 字首,中綴,字尾表示式轉換 date 2017 09 10 19 45 09 categories technology tags 在計算機中表示式有三種,字首表示式 波蘭式 中綴表示式,字尾表示式 逆波蘭式 如表示式 a b c d e f 字首表示式 a b cd ef 中綴表示式 ...