棧的應用 中綴和字尾表示式的轉換及計算

2021-08-02 18:04:58 字數 1839 閱讀 5020

中綴表示式:人使用的類似於(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 中綴表示式符合人類的閱讀和思維習慣 字尾表示式符合計算機的 運算習慣 中綴轉字尾演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進...