參考:
字首表示式的計算機求值(波蘭式):
從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算(棧頂元素 op 次頂元素),並將結果入棧;重複上述過程直到表示式最左端,最後運算得出的值即為表示式的結果。
字尾表示式的計算機求值(逆波蘭式):
與字首表示式類似,只是順序是從左至右:
從左至右掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算(次頂元素 op 棧頂元素),並將結果入棧;重複上述過程直到表示式最右端,最後運算得出的值即為表示式的結果。
中綴表示式轉換:
手工求法:例如求a+b*c-(d+e)
先加全括號:((a+(b*c))-(d+e))
字首:將所用運算子移動到括號前面,然後將括號去掉:-+a*bc+de
字尾:將所有運算子移動到括號後面,然後將括號去掉:abc*+de+-
程式設計:
將中綴表示式轉換為字首表示式:
遵循以下步驟:
(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;
int higher(const char in1,const char in2)
else if(in1=='*'||in2=='/')
}string in2polish(const string& str)
op.push(c);}}
else//為括號
op.pop();//彈出')'
}else//為num}}
//最後要把op中剩餘的符號壓入num中
while (!op.empty())
while(!num.empty())
return ans;
}int main()
else if(*cc=='+')
sign=1;
else if(*cc=='-')
sign=-1;
else if(*cc>='0'&&*cc<='9')
else
return num;
++cc;
}return num;
}int main()
int getindex(const char& c)
return ans;
}string any2ten(const string& str,const int& b)
return to_string(ansnum);
}int main() {
string inp="10";
string ans=ten2any(inp,60);
string inp2="100";
string ansnum=any2ten(inp2,3);
cout<
參考:
面試問題總結
學了一年多的語言還沒有真正的搞清楚什麼是面向過程什麼是物件導向,今天整理一下,還希望大家可以提出自己的寶貴意見,謝謝。第一大問題面向過程和物件導向的理解 向過程的概念 面向過程就是分析出我們完成一件事情所需要的步驟,然後用函式把這些步驟一步一步的實現,使用的時候在一步一步的按順序的呼叫。就像是洗臉 ...
面試問題總結
1.兩個軟體如何傳送訊息的?底層就是通過socket實現的 基於socket實現客戶端向伺服器 socket scoket new socket 目標ip或網域名稱,目標埠 建立連線,如果網域名稱解析不了會拋unknownhostexception的異常 讀取從伺服器返回的資訊 流 buffered...
面試問題總結(一)
union和union all的區別 union要進行重複值掃瞄,效率比union all要低 union會自動壓縮多個結果集合中的重複結果,而union all則將所有的結果全部顯示出來,不管是不是重複。注意 使用union和union all必須保證各個select 集合的結果有相同個數的列,並...