思路:
1.從左到右獲取中綴表示式
2. *,/ 的優先順序最高,遇到直接入棧,直到遇到比他優先順序低的,依次出棧
3.(,遇到直接入棧,等遇到右括號 )後,將( **棧的運算子出棧輸出,( 出棧不輸出
4.+ - ,如果棧空,直接入棧,否則將棧中優先順序不低於它們的運算子依次彈出,直到棧空或遇到 )為止
**如下所示:
//中綴轉字尾
void
change
(char str[
], stack s)
//'+','-'優先順序最低
if(str[i]
=='+'
|| str[i]
=='-'
)else
break;}
push
(str[i]
, s);}
}}else
if(str[i]
==')'
)pop
(s);
}else
if(str[i]
=='*'
|| str[i]
=='/'
|| str[i]
=='('
)push
(str[i]
, s)
;else
if(str[i]
=='\0'
)break
;else
i++;}
while(!
isempty
(s))
}
完整程式如下所示:
#include
#include
#include
#include
//棧的定義
struct node
node;
typedef
struct node *stack,
*ptrnode;
//建立棧
stack creatstack
(int max)
intisfull
(stack s)
intisempty
(stack s)
void
push
(char x, stack s)
// s->array[++s->topofstack] = x;
}void
pop(stack s)
char
top(stack s)
//中綴轉字尾
void
change
(char str[
], stack s)
//'+','-'優先順序最低
if(str[i]
=='+'
|| str[i]
=='-'
)else
break;}
push
(str[i]
, s);}
}}else
if(str[i]
==')'
)pop
(s);
}else
if(str[i]
=='*'
|| str[i]
=='/'
|| str[i]
=='('
)push
(str[i]
, s)
;else
if(str[i]
=='\0'
)break
;else
i++;}
while(!
isempty
(s))
}int
main()
/*樣例:
2*(9+6/3-5)+4
2 9 6 3 / + 5 - * 4 +
5-8*(6+7)+9/4
5 8 6 7 + * - 9 4 / +
*/
利用棧實現中綴表示式轉換為字尾表示式
中綴表示式就是我們平時最熟悉的算式表示式,操作符在兩個數中間。那麼可以想到字尾表示式就是操作符在兩個數後面。例子 中綴表示式 1 2 3 字尾表示式 1 2 3 棧中儲存的是操作符和括號。從左到右遍歷中綴表示式。遇到括號 遇到數字 遇到操作符 當中綴表示式遍歷完後,依次彈出棧中的所有元素。特殊處理 ...
中綴表示式轉換為字尾表示式
今天我們課前談一談,要說點什麼好呢?最近小甲魚發現,很多魚油在學習資料結構和演算法的時候積極性已經開始有點下降了。甚至很多朋友懷疑資料結構和演算法到底有沒有用?實話說,在大廈的防震設計 消除疾病 防止水源枯竭這些實際問題中,很遺憾,資料結構和演算法幾乎起不到任何直接作用。那為什麼我們要學呢?很簡單,...
中綴表示式轉換為字尾表示式
字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...