將中綴表示式轉化為字尾表示式的過程中,需要對讀到的運算物件進行不同的處理:
(1)如遇到空格視為分隔符,不需要處理;
(2)如遇到運算數直接輸出;
(3)若是左括號,將其壓入至堆疊中;
(4)若遇到右括號,表明括號內的中綴表示式已經掃瞄完畢,將棧頂的運算子彈出並輸出,直到遇到左括號(出棧,但不輸出)。
(5)若遇到運算子,若該運算子優先順序大於棧頂運算子的優先順序時,則將其壓棧。若該運算子小於等於棧頂運算子的優先順序,則將棧頂運算子彈出並輸出,再比較新的棧頂運算子,如此,直到該運算子大於棧頂運算子的優先順序為止,然後將該運算子壓棧。
(6)若中綴表示式處理完畢,則將堆疊中留存的運算子一一輸出。
由於需要比較運算子的優先順序,可在儲存運算子的鏈棧結構中新增乙個記錄運算子優先順序的整型變數priority:
/*定義鏈棧結構型別*/
typedef
struct snode
stack;
將中綴表示式轉換為字尾表示式也需要讀取表示式中的運算數和運算子,因而可沿用字尾表示式求值(見前一篇)的讀取運算物件的函式getop()。實現整個轉換過程的trans()函式如下:
void
trans
(char
*expr)
else
if(str[0]
==')'
)elseif(
(str[0]
=='+')||
(str[0]
=='-')||
(str[0]
=='*')||
(str[0]
=='/'))
else
pri=2;
/*將新讀到的運算子寫入棧頂*/
if(s-
>next==
null
|| pri>s-
>next-
>priority)
else
while
(s->next!=
null
&& pri<=s-
>next-
>priority)
;//一定要將s->next!=null這個判斷條件寫在最前面
push
(s,str[0]
);}}
else}if
(pri==bug)
break;}
if(pri!=bug)
}else
pri=bug;}if
(pri==bug)
cout<<
"無法轉換"
<
}
函式的主體部分是乙個while()語句,其作用是讀取getop()函式傳遞過來的運算子或運算數,來進行相應的操作;而這個while()迴圈又主要由if-else多重條件語句實現:
當跳出while()迴圈後,需要將棧中剩餘的運算子輸出。
用鏈棧實現的完整**如下:
#include
#include
#include
#include
#define maxop 30
//運算元序列可能的最大長度
#define bug 10
//標記讀取異常
using
namespace std;
typedef
char elementtype;
/*定義列舉型別,其中的三個元素分別對應運算數、運算子、字串結尾*/
enum type
;/*定義鏈棧結構型別*/
typedef
struct snode
stack;
intmain()
/*初始化鏈棧*/
void
initstack
(stack *s)
/*入棧:將元素x讀入棧頂元素*/
void
push
(stack *s,elementtype x)
/*退棧:彈出棧頂元素*/
elementtype pop
(stack *s)
else
}/*從字尾表示式中讀入乙個物件(運算數或運算子),並將其儲存、返回。
getop()函式的三個形參引數:
1.char *expr 是指向字尾表示式(乙個字元陣列)的字元指標;
2.int *index 是指示字尾表示式(字元陣列)下標的整型指標;
3.char *str 是指向儲存所讀物件(運算數或運算子)的字元指標。
函式的返回值是乙個列舉型別
*/type getop
(char
*expr,
int*index,
char
*str)
if(str[i]
=='\0')(
*index)--;
//如果讀到字尾表示式的結尾,使下標停在結束符處
str[i]
='\0'
;//寫入結束標誌
if(i==0)
//判斷是否讀到字尾表示式的結束
return end;
elseif(
isdigit
(str[0]
))//判斷str中存入的是否為運算數
return num;
else
//判斷str中是否存的運算子
return opr;
}void
trans
(char
*expr)
else
if(str[0]
==')'
)elseif(
(str[0]
=='+')||
(str[0]
=='-')||
(str[0]
=='*')||
(str[0]
=='/'))
else
pri=2;
/*將新讀到的運算子寫入棧頂*/
if(s-
>next==
null
|| pri>s-
>next-
>priority)
else
while
(s->next!=
null
&& pri<=s-
>next-
>priority)
;//一定要將s->next!=null這個判斷條件寫在最前面
push
(s,str[0]
);}}
else}if
(pri==bug)
break;}
if(pri!=bug)
}else
pri=bug;}if
(pri==bug)
cout<<
"無法轉換"
<
}
注意:輸入時運算子、運算數之間需要用空格隔開。 C 詳解 中綴表示式轉化為字尾表示式
中綴表示式轉化為字尾表示式演算法思想細節 首先明確什麼是中綴表示式,什麼是字尾表示式。中綴表示式是乙個通用的算術或邏輯公式表示方法,操作符是以中綴形式處於運算元的中間 eg 3 4 附 中綴表示式不易被計算機處理。字尾表示式,又稱逆波蘭式,指的是不包含括號,運算子放在兩個運算物件的後面,所有的計算按...
C語言 將中綴表示式轉化為字尾表示式
在開始之前,我們首先要了解以下運算子在c語言中的優先順序 圓括號 乘 除 求餘運算子 加 減運算子 優先順序由高到低排列!中綴表示式是什麼?對於乙個表示式,我們平時是這樣寫的 3 2 5 3 這樣的乙個表示式就是中綴表示式 也稱中序表示式 但由於這種表示式不容易被計算機解析,所以我們需要將其轉化為字...
C語言中綴表示式轉化為字尾表示式
include include include include 別靠空想!及其浪費時間!多謝謝偽 分析一下!字尾表示法計算時候的思路!先把元素推到棧中,每碰到乙個 char stack 50 char output 50 char nouse 50 int flag 0 char sz 50 cha...