字串的前中字尾表示式,以及KMP演算法。

2021-07-10 08:16:33 字數 2778 閱讀 6326

本文主要涉及字串的前中字尾表示式,以及kmp演算法。

首先如我們所知道的,在c++中,乙個字串有三種表達形式。字首、中綴和字尾形式。

區別在於:字首表示式由運算元後面緊跟兩個運算元構成的。如:*3 5

中綴表示式的運算元處於兩個運算元之間。如:3*5

字尾表示式的運算元緊跟運算元,並處於末尾。如:3 5*

我們再談談這三種表達形式的轉換。

個人認為

中綴表示式轉換成字尾表示式

正確的轉換方法:

遍歷中綴表示式的每個節點,如果:

1、 該節點為運算元:

直接拷貝進入字尾表示式

2、 該節點是運算子,分以下幾種情況:

a、 為「(」運算子:

壓入臨時堆疊中

b、 為「)」運算子:

不斷地彈出臨時堆疊頂部運算子直到頂部的運算子是「(」為止。並把彈出的運算子都新增到字尾表示式中

c、 為其他運算子,有以下步驟進行:

比較該運算子與臨時棧棧頂指標的運算子的優先順序,如果臨時棧棧頂指標的優先順序大於等於該運算子的優先順序,彈出並新增到字尾表示式中,反覆執行前面的比較工作,直到遇到乙個棧頂指標的優先順序低於該運算子的優先順序,停止彈出新增並把該運算子壓入棧中。

此時的比較過程如果出現棧頂的指標為『(』,則停止迴圈並把該運算子壓入棧中,注意:『(』不要彈出來。

遍歷完中綴表示式之後,檢查臨時棧,如果還有運算子,則全部彈出,並新增到字尾表示式中。

個人認為

中綴表示式轉換成字首綴表示式

正確的轉換方法:

遍歷中綴表示式的每個節點,如果:

1、該節點是為

運算元:

壓入棧中。

2、 該節點是運算子,分以下幾種情況:

a、 為「(」運算子:

將臨時堆疊的內容彈出,並放入字首表示式中。

b、 為「)」運算子:

無操作

c、為其他運算子時,則直接放入字首表示式中。

這裡我給出乙個中綴表示式:a+b*c-(d+e)

第一步:按照運算子的優先順序對所有的運算單位加括號:式子變成了:((a+(b*c))-(d+e))

第二步:轉換字首與字尾表示式

字首:把運算符號移動到對應的括號前面

則變成了:-( +(a *(bc)) +(de))

把括號去掉:-+a*bc+de 字首式子出現

字尾:把運算符號移動到對應的括號後面

則變成了:((a(bc)* )+ (de)+ )-

把括號去掉:abc*+de+- 字尾式子出現

發現沒有,字首式,字尾式是不需要用括號來進行優先順序的確定的。如表示式:3+(2-5)*6/3

但兩種方法形成的字尾表示式的形式不同:

中綴表示式:a+b*(c-d)/f-e

形成的字尾表示式:

1. a b c d - f /  * e - +

2. a b c d - * f / + e -

注意:前字尾表示式的計算不依照計算符的優先順序,直接按照從左到右的計算。

kmp匹配演算法原始碼。

問題描述:

串的前字尾問題。            kmp演算法,next陣列

next陣列的作用在於儲存當前字元之前的字串中,有多大長度的相同字首字尾

如next[4]=3  意思是當前字元之前前字尾相同的字元數為3。

舉乙個例:字串aaaabbcde。

它的next數字為:-1、-1、-1、-1、3、0、0、0、0

所以kmp的匹配演算法核心不同於暴力匹配方法之處在於如果當前第j個字元匹配失敗,它並不是從新重頭開始匹配,而是提取next陣列中儲存的當前字元之前的最長字首的下乙個字元開始再一次匹配。這種方法提高了整體效能。

//修正後的求next陣列各值的函式**  

voidget_nextval(charconst* ptrn,intplen,int* nextval)    

else//迴圈的else部分  

j = nextval[j];    

}    

}  

kmp

//int kmp_seach(char const*, int, char const*, int, int const*, int pos)  kmp模式匹配函式  

//輸入:src, slen主串  

//輸入:patn, plen模式串  

//輸入:nextval kmp演算法中的next函式值陣列  

intkmp_search(charconst* src,intslen,charconst* patn,intplen,intconst* nextval,intpos)    

else

}    

if( j >= plen )    

returni-plen;    

else

return-1;    

}   

前,中,字尾表示式

字首表示式,中綴表示式,字尾表示式都是四則運算的表達方式,用以四則運算表示式求值,即數學表示式的求值。比如乙個簡單的數學表示式 1 2 3 4 這是我們常見的數學表示式型別 即中綴表示式 為什麼要將簡單的中綴表示式轉化為複雜的波蘭式或逆波蘭式 原因在於,簡單的中綴表示式在用人的思維邏輯來看,確實簡單...

前 中 字尾表示式

1 字首表示式又稱波蘭式,字首表示式的運算子位於運算元之前 2 舉例說明 3 4 5 6 對應的字首表示式就是 3 4 5 6 從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算 棧頂元素 和 次頂元素 並將結果入棧 重複上述過程直到表示式最左...

前 中 字尾表示式的轉換

前 中 字尾表示式的轉換 自然表示式轉換為前 中 字尾表示式,其實是很簡單的。首先將自然表示式按照優先順序順序,構造出與表示式相對應的二叉樹,然後對二叉樹進行前 中 字尾遍歷,即得到前 中 字尾表示式。舉例說明將自然表示式轉換成二叉樹 a b c d 根據表示式的優先順序順序,首先計算 b c 形成...