中綴表示式求值及中綴表示式到字尾表示式的轉換

2021-10-25 07:28:54 字數 1884 閱讀 3935

標頭檔案

#include

#define ok 1

#define error 0

#define overflow -2

#define maxsize 100

typedef

struct

sqstack;

status initstack

(sqstack &s)

status emptystack

(sqstack s)

status push

(sqstack &s,selemtype e)

status pop

(sqstack &s,selemtype &e)

status gettop

(sqstack s)

//),selemtype &e)

const

char oper[7]

=;boolin(

char ch)

}return

false;}

char

precede

(char theta1,

char theta2)

else

if(theta1 ==

'('|| theta1 ==

'#'|| theta2 ==

'('||

(theta1

=='+'|| theta1 ==

'-')

&&(theta2 ==

'*'|| theta2 ==

'/')

)else

return

'>';}

char

operate

(char first,

char theta,

char second)

return0;

}

主函式

#include

typedef

int status;

typedef

char selemtype;

#include

"sqstack.h"

char

evaluateexpression()

else

switch

(precede

(gettop

(optr)

,ch))}

return

gettop

(opnd);}

intmain()

注:此程式只能計算0~ 9的數因為在ascii表中只能轉換0~ 9的數為此程式的弊端;

例:(6/3+5)6

1.遇到運算元,直接輸出;

2.棧為空時,遇到運算子,入棧;

3.遇到左括號,將其入棧;

4.遇到右括號,執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出;

5.遇到其他運算子』+」-」」/』時,彈出所有優先順序大於或等於該運算子的棧頂元素,然後將該運算子入棧;

6.最終將棧中的元素依次出棧,輸出。

首先從左向右掃瞄遇到左括號它比#的優先順序高將它入棧

然後遇到運算元6輸出 6

遇到/號遇到左括號入棧 6

遇到運算元輸出3 63

遇到+號由於/號優先順序大於+號所以彈出/號並將+號壓入棧 63/

遇到運算元5輸出 63/5

遇到右括號與左括號抵消掉並將+號彈出 63/5+

遇到乘號比#的優先順序高入棧 63/5+

與運算元6輸出 63/5+6

最後將乘號彈出 63/5+6*

中綴表示式求值

中綴表示式用於計算乙個表示式,比如計算器 就是這樣實現的 這兒是用棧的資料結構來實現的。首先輸入乙個字串,表示乙個表示式,然後用乙個棧儲存數字,另外乙個棧儲存符號 如果當前運算子優先順序比棧頂元素優先順序高,則入棧,若當前運算子優先順序小於等於棧頂運算子優先順序,則從數字棧中彈出兩個元素,從符號棧中...

中綴表示式求值

表示式求值都需要2個棧。乙個是符號棧,另乙個是數字棧。拿上面的字尾式45 來說,咱們剛才將表示式從4 5轉換到45 的過程是咱們一眼就能看出來的,但是計算機不能像咱們這樣做,因為他不會。他只會從表示式的開頭,順序掃瞄表示式的每乙個字元,它不能像咱們一樣 一眼就 看 出來。計算機是如何轉換的呢?1.從...

中綴表示式求值

計算 calc.cpp 問題描述 小明在你的幫助下,破密了ferrari設的密碼門,正要往前走,突然又出現了乙個密碼門,門上有乙個算式,其中只有 0 9 求出的值就是密碼。小明數學學得不好,還需你幫他的忙。用整數除法 輸入 輸入檔案calc.in共1行,為乙個算式。輸出 輸出檔案calc.out共1...