棧應用之中綴表示式轉字尾表示式(C語言)

2021-09-26 19:22:21 字數 2144 閱讀 3931

我從網上摘取了幾個思路,這裡的思路在優先順序的比較上大致相同,方法多變,這裡不再一一詳解。

———————————————————————————————————

1、數字直接輸出

2、遇到左括號直接入棧,遇到右括號將棧中左括號之**棧的運算子全部彈棧輸出,同時左括號出棧但是不輸出。

3、遇到乘號和除號直接入棧,直到遇到優先順序比它更低的運算子,依次彈棧。

4、遇到加號和減號,如果此時棧空,則直接入棧,否則,將棧中優先順序高的運算子依次彈棧(注意:加號和減號屬於同乙個優先順序,所以也依次彈棧)直到棧空或則遇到左括號為止,停止彈棧。(因為左括號要匹配右括號時才彈出)。

5、獲取完後,將棧中剩餘的運算符號依次彈棧輸出。

———————————————————————————————————

1、首先我們要建立乙個集合 slist 來存放例子中的資料和操作符號,乙個棧opstack來存放中間的操作符號,乙個集合dlist 來存放最後的轉換結果。

2、從slist中取出乙個元素a然後進行以下判斷:

(1)如果a是數字,則直接存如dlist

(2)如果a是運算子,則和opstack棧頂的元素進行運算優先順序比較

(2-1)如果a的優先順序高於棧頂運算子優先順序,則將a入棧opstack

(2-2)如果a的優先順序低於或等於棧頂運算子的優先順序,那麼將棧頂的元素出棧存入dlist,重複此步驟直到棧頂的運算子優先順序低於當前運算子(或者遇到括號),然後a入棧。

3、如果a是左括號「(」直接入棧,如果是右括號「)」,則將opstack中的運算子彈出存入dlist,直到彈出左括號,左右括號均不存入dlist,左括號永遠不會彈出,直到遇到右括號。

4、不斷重複以上步驟直到表示式解析完成。

———————————————————————————————————

這是另一種思路的**:

#include

#include

#include

#define stack_init_size

20#define stack_dila_size

10typedef char elemtype;

typedef struct

sqstack;

void

initstack

(sqstack*s)

s->top = s-

>base;

s->stacksize =

stack_init_size;}

void

push

(sqstack*s, elemtype x)

s->top = s-

>base +

stack_init_size

; s-

>stacksize =

+stack_dila_size;}

*(s-

>top)

= x;

s->top++;}

void

pop(sqstack*s, elemtype*x)

s->top--

;*x =

*s->top;

}int stacklen

(sqstack*s)

void

clearstack

(sqstack*s)

void

destroystack

(sqstack*s)

int main()

}if(')'

== c)

}elseif(

'+'== c ||

'-'== c)

else

else

}while

(stacklen

(s)&&

'('!= x)

;push

(s, c);}

}elseif(

'*'== c ||

'/'== c ||

'('== c)

elseif(

'#'== c)

scanf_s

("%c"

,&c,

sizeof

(c));}

while

(stacklen

(s))

return0;

}

棧的應用之中綴表示式轉字尾表示式

由於中綴表示式有括號的存在,其運算次序比較複雜,直接分析有些難度。先考慮不帶括號的中綴表示式的轉換。由於運算符號具有不同的優先順序,當前的運算子不能直接放在運算元的後面,需要考慮下乙個運算子的優先順序。對比三個不同的中綴表示式轉換為字尾表示式的結果 可以發現 1.字尾表示式數字的出現順序和中綴表示式...

棧 中綴表示式轉字尾表示式

中綴轉字尾的演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 運算符號 與棧頂符號進行優先比較 若棧頂符號優先順序低 此符號進棧 預設棧頂若是左括號,則左括號的優先順序最低 若棧頂符號優先順序高 將棧頂符號彈出 並輸出 直到棧頂的符號優先順序低,然後進棧 右括號 將棧...

棧的應用 中綴表示式轉字尾表示式

有關棧api詳情請參看我的另一篇博文 棧的鏈式儲存 api實現 例項 5 4 5 4 1 2 3 1 2 3 8 3 1 5 8 3 1 5 中綴表示式符合人類的閱讀和思維習慣 字尾表示式符合計算機的 運算習慣 中綴轉字尾演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進...