我從網上摘取了幾個思路,這裡的思路在優先順序的比較上大致相同,方法多變,這裡不再一一詳解。
———————————————————————————————————
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 中綴表示式符合人類的閱讀和思維習慣 字尾表示式符合計算機的 運算習慣 中綴轉字尾演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進...