資料結構實驗 中綴表示式求值 可帶括號

2021-09-27 09:51:28 字數 1347 閱讀 8787

輸入乙個含括號的加減乘除表示式,輸出該表示式的值:

思路:輸入表示式,注意(可能帶有括號),運用兩個棧,符號棧和數字棧,首先判斷優先順序,把所有符號的優先順序打表,進行運算,入棧時模仿單調棧,如果當前 優先順序比棧頂元素優先順序小,說明當前元素需要趕快計算,不然會影響以後的結果。例如2*3-2,『-』進來的時候,優先順序比』*』小,所以先把*運算執行完,執行完之後再把減號放進來。如果遇到優先順序相等的情況即()的情況,就把現在括號內的都清空。另外我們可以在 字串 前面後面都加乙個#,防止最後計算不完的情況。

解釋一下為什麼 ,新來的優先順序要比棧頂元素的優先順序高

看一下這個例子:

2*3+1  當來到'+'時,這時候加號的優先順序比棧頂元素'*'底,說明前面的計算必須要完成了,要不然會出錯。

然後注意括號 棧頂元素 括號 的優先順序 要比 新來括號的優先順序低,要讓他入棧。

ac:

#includeconst int maxn=1000250;

using namespace std;

typedef long long ll;

struct num

int empty()

void push(int x)

void pop()

int top()

}st;

struct oper

int empty()

void push(char x)

void pop()

char top()

}op;

char str[maxn];

int p[10][10]=,,,

,,,,

};int creatmap(char a)

}int cmp(char a,char b)// a是棧頂元素

int cal(int a,int b,char ch)

}void solve()

i--;//不滿足的時候多加了1

st.push(x);

} else

else if(cmp(op.top(),str[i])==1)

}if(str[i]!='#'&&str[i]!=')') op.push(str[i]);}}

} printf("%d\n",st.top());

}int main()

/***

7-6*(2/1+2)

***/

執行結果:

優先順序表參照:《資料結構》 宋麗華 張小峰老師著

資料結構 中綴表示式求值解法

簡述中綴表示式的做題思想 例如 輸入乙個表示式為 3 2 5 3 1 3 4 2 定義兩個棧,乙個是操作符棧 sdoc 乙個是運算元棧 sdop 1.首先判斷輸入的字元是數還是操作符 如果是運算元 char cinch int x while cinch getchar n 此處是輸入函式並且不為回...

中綴表示式求值

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

中綴表示式求值

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