思想:
用兩個棧實現,規則如下:
(1) 初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;
(2) 從右至左掃瞄中綴表示式;
(3) 遇到運算元時,將其壓入s2;
(4) 遇到運算子時,比較其與s1棧頂運算子的優先順序:
(4-1) 如果s1為空,或棧頂運算子為右括號「)」,則直接將此運算子入棧;
(4-2) 否則,若優先順序比棧頂運算子的較高或相等,也將運算子壓入s1;
(4-3) 否則,將s1棧頂的運算子彈出並壓入到s2中,再次轉到(4-1)與s1中新的棧頂運算子相比較;
(5) 遇到括號時:
(5-1) 如果是右括號「)」,則直接壓入s1;
(5-2) 如果是左括號「(」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到右括號為止,此時將這一對括號丟棄;
(6) 重複步驟(2)至(5),直到表示式的最左邊;
(7) 將s1中剩餘的運算子依次彈出並壓入s2;
(8) 依次彈出s2中的元素並輸出,結果即為中綴表示式對應的字首表示式。
**如下:
#include
#include
#include
using
namespace std;
intpri
(char a)
}int
main()
else
if(c==
'(')
s2.pop();
}else
s2.push
(c);}}
while
(s2.
empty()
!=1)
cout<<
"輸出 "
;while
(s1.
empty()
!=1)return0;
}
還可以用map :
mapm;
m[』+』] = 1;
m[』-』] = 1;
m[』*』] = 2;
m[』/』] = 2;
m[c] < m[symbol.top()]
思想1:建樹
#include
#include
#include
#include
#include
using
namespace std;
string s[
105]
;int n=0;
struct node
;void
dfs(node *t)
void
f(string str,node *
&t)int op=
9999
,ex=
0,idx=-1
;for
(int i=str.
length()
-1; i>=
0; i--)}
else
if(str[i]
=='*'
||str[i]
=='/')}
}if(idx==-1
) t-
>v=str[idx]
;//a+b
f(str.
substr(0
,idx)
,t->l);f
(str.
substr
(idx+
1,str.
length()
-idx-1)
,t->r);}
double
si(string s)
//string轉double}if
(st==-1
)else
}int
main()
else
if(s[i][0
]=='+')
else
if(s[i][0
]=='-')
else
if(s[i][0
]=='*')
else
if(s[i][0
]=='/')
} cout<
}
思想2:用棧
中綴表示式轉為字尾表示式也有一定的規則,這個規則是根據操作符的運算優先順序來定的,還是上面那個中綴表示式為:「4.991.06+5.99+6.991.06」,轉為字尾表示式的規則為:
(1)這裡定義乙個操作符棧stack來儲存遇到的操作符,還需要定義string作為字尾表示式輸出返回;
(2)首先需要對輸入的中綴表示式進行「切片」處理,所謂切片,即對所輸入的中綴表示式進行元素分割,這裡的每個元素要麼是乙個操作符(「+-*/()」),要麼是乙個運算元(「.0123456789」),把這些元素儲存到乙個vectorinputvec中;
(3)然後依次遍歷inputvec中元素,根據其是運算元還是操作符來進行不同的「處理」。這裡的處理規則為:
如果是運算元,則直接儲存到輸出string中;
如果是操作符
如果操作符棧為空,則把操作符入棧;
否則,則比較當前運算子與棧頂操作符優先等級;
如果當前操作符優先等級高,則當前操作符入棧;
否則,彈出棧頂操作符到輸出string中;
中綴表示式轉字尾表示式c++實現**如下:
//設定操作符優先順序,這裡考慮到括號("("、")")匹配,定義設定左括號"("的優先順序最高,且只有在遇到右括號時才彈出左括號
intpriority
(const string str)
}/*********************中綴表示式轉為字尾表示式**************************/
string infixtopostfi
(const string &str)
else
}else
}//遍歷切片結果vector中每個元素
stack operatorstack;
//建立空棧,用來儲存操作符
vector postfioutvec;
//儲存中綴輸出,這裡是儲存到vector
for(
int i=
0; isize()
; i++
)else
operatorstack.
pop();
//刪除棧頂元素(這裡是刪除左括號"(")
}else
else
break;}
operatorstack.
push
(inputvec[i]);
}}}//如果當前元素是運算元,直接輸出
else
}while
(!operatorstack.
empty()
)//在輸出中插入空格
vector
::const_iterator itr=postfioutvec.
begin()
+1;while
(itr!=postfioutvec.
end())
postfioutvec.
push_back
(" ");
//新增最後乙個空格
//vector輸出為string,作為字尾表示式結果返回
string result;
for(
int i=
0; isize()
; i++
)return result;
}
思想:
字尾表示式的求值規則為:從左到右掃瞄字尾表示式,如果遇到乙個運算元,將其壓入棧中,如果遇到乙個操作符,則從棧中彈出兩個運算元,計算結果,然後把結果入棧,直到遍歷完字尾表示式,則計算完成,此時的棧頂元素即為計算結果。
**如下:
/*********************字尾表示式求值(直接利用c++stl提供的stack實現)**************************/
double
postfixexpression
(const string &str)
if(tempstr ==
"-")
if(tempstr ==
"*")
if(tempstr ==
"/")
}else
//控制迭代
i = end +1;
}return mystack.
top();
}
中綴轉字尾和字首
中綴轉字尾 include using namespace std bool isoperator char ch intgetpriority char ch return level string postorder void trans string inorder s.pop else el...
中綴轉字尾
include using namespace std define max 30 struct stack void initstack stack s char pop stack s void push stack s,char c char top stack s int copare ch...
中綴轉字尾
棧的特性 後進先出 last in first out 資料結構 中綴 9.11 3 1 5 分離數字與運算子 9.11 3 1 5 字尾 9.11 3 1 5 中綴轉字尾過程 當前元素為數字,輸出,作為字尾表示式的一部分 如果當前運算子,比棧頂運算子優先順序低 小於等於 時,將棧頂元素輸出,作為字...