中綴表示式:人使用的類似於(2+3*5),運算符號在數字中間的表示式
字尾表示式:不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行(不再考慮運算子的優先規則。這是計算機的計算方式。
利用棧,可以實現中綴表示式轉化為字尾表示式。也可以實現字尾表示式的計算。這裡主要實現難度較大的中綴表示式向字尾表示式的轉化。
準備兩個棧,乙個符號棧:存放運算符號(用後銷毀);另乙個結果棧:存放字尾表示式。
將中綴表示式按順序讀入。
遇到數字就直接push進入結果棧。
遇到+-*/ 運算子,檢查符號棧是否有運算級相同或更低的符號,一直pop後,再push進入結果棧。檢查過程知道遇到更高階運算子停止。
遇到(左括號,直接入符號棧
遇到)右括號,將符號棧裡面的符號pop,再push進入結果棧,直到遇到(停止。而兩個括號都丟棄。
最後,將符號棧的剩餘符號挨個彈出,再push進入結果棧。銷毀不需要的符號棧。
這個程式支援+-*/操作,支援字母和0-9的數字。網上的其他實現多是:遇到數字連續輸出,再比較符號棧的內容再決定是否輸出符號。這裡新開了乙個棧作為儲存結果的結構。而最後的輸出是倒序輸出。
#include
#include
using
namespace
std;
template
class stack;
template
stack::stack(int s)
template
void stack::push(t elem)
*top = elem;
++top;
}template
t stack::pop()
}template
int stack::getsize()
template
void stack::clearstack()
template
void stack::deletestack()
void getresult(string eval,stack &result_stack)
if(tem=='(')
symbol_stack.push(tem);
symbol_stack.push(eval[i]);}}
else
if(eval[i]==')') //最終最括號也被彈出
}else
if(eval[i]=='(')
symbol_stack.push(eval[i]);
else
if(eval[i]=='*' || eval[i]=='/')
if(tem=='(' || tem=='+' || tem=='-')
symbol_stack.push(tem);
symbol_stack.push(eval[i]);}}
else ;
}while(symbol_stack.getsize())
result_stack.push(symbol_stack.pop());
}int main()
cout
0;}
字尾表示式的計算使用棧進行計算。如果遇到符號輸入,那麼就彈出前兩個資料,進行運算,並且將結果再推入棧中。如果資料輸入,那麼直接入棧。這裡輸入假定是字尾表示式的格式。
**較轉換字尾表示式簡單,因為沒有那麼多的判定條件,篇幅有限,這裡不做實現了。
csdn位址 :
也可以致信進行交流 : [email protected]
棧的應用例項 中綴表示式轉換為字尾表示式
infix to postfix.c include include include include struct op node struct stack record struct stack record create stack intmax elements s malloc sizeof...
棧的應用 中綴表示式和字尾表示式互轉
中綴表示式是我們經常接觸的算術表示式,如 a b c,a c d 等,優點是便於記憶,缺點是對運算順序有嚴格的要求。字尾表示式又稱逆波蘭式,如abc d e f g 雖然不便記憶,但是它不像中綴表示式,對於運算的順序是沒有要求,可以按照順序掃瞄的方法計算表示式,因此在計算機內部容易用程式設計的方式實...
棧的應用 中綴表示式轉字尾表示式
有關棧api詳情請參看我的另一篇博文 棧的鏈式儲存 api實現 例項 5 4 5 4 1 2 3 1 2 3 8 3 1 5 8 3 1 5 中綴表示式符合人類的閱讀和思維習慣 字尾表示式符合計算機的 運算習慣 中綴轉字尾演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進...