C語言 利用 字尾表示式 求解 中綴表示式

2021-10-02 21:57:13 字數 2532 閱讀 3004

一名大一初學狗,最近在學習棧的應用,在此記錄解題**:

** 題目描述 **

給出乙個表示式,其中運算子僅包含+,-,*,/,^要求求出表示式的最終值 ,資料可能會出現括號情況, 還有可能出現多餘括號情況 ,資料保證不會出現》 maxlongint的資料 ,資料可能回出現負數情況

輸入僅一行,即為表示式

輸出僅一行,既為表示式算出的結果

樣例輸入

c (2+2)^(1+1)

樣例輸出

解題思路:

將中綴表示式轉換成字尾表示式–>計算字尾表示式的值–>得出結果

轉換成字尾表示式

第一步:建立兩個棧number、symbol,分別用來儲存字尾表示式,轉換過程中運算子儲存的空間。

第二步:依次對資料(給定的中綴表示式)進行操作:

以 (2+2)^(1+1) -(-100) * 4/2 為例,結果為 22+

11+^

-100

4 * 2/-

字尾表示式的運算

建立乙個新棧answer,掃瞄number棧,遇到數字就直接壓入answer棧,遇到運算子,則取出answer棧棧頂的兩個數字進行相應計算,運算的結果再入棧,直到掃瞄完,此時answer棧只剩下乙個數值,即為最終結果。

以 2 2 + 1 1 + ^ -100 4 * 2 / - 為例

+——>2+2=4,+——>1+1=2,^ ——>4^2=16,* ——> (-100)*4=(-400),

/ ——>(-400)/2=(-200), – ——> 16-(-200)=216。

**如下:

#include

int flag;

struct symbol

symbol;

struct number

number;

struct answer

answer;

void

init()

//將運算子替換成數字以比較優先順序

intreplace

(char a)

}//比較符號優先順序

intcompare

(char s,

char e)

//^運算子的計算操作

void

fun(

)int t = answer.a[answer.top -1]

;while

(--answer.a[answer.top])}

//符號計算操作

void

priority

(int i)

answer.top--;}

//轉換為逆波蘭(字尾)表示式

void

reversepolish

(char ex)

number.n[

++number.top]

= ex[i]

;for

(int m = i +

1; ex[m]

<=

'9'&& ex[m]

>=

'0'; i++

, m++)}

else

} symbol.s[

++symbol.top]

= ex[i]

;continue;}

if(ex[i]

=='('

) symbol.s[

++symbol.top]

= ex[i]

;continue;}

if(ex[i]

==')'

)while

(symbol.s[symbol.top]

!='('

) symbol.top--

;continue;}

if(compare

(symbol.s[symbol.top]

, ex[i]

)) symbol.s[

++symbol.top]

= ex[i]

;else}}

number.n[

++number.top]

=' ';}

while

(symbol.top !=-1

) number.n[

++number.top]

= symbol.s[symbol.top]

; symbol.top--;}

}//逆波蘭(字尾)表示式計算

void

calculation()

if(number.n[i]

<=

'9'&& number.n[i]

>=

'0')

if(t ==1)

}else

}printf

("%d\n"

, answer.a[answer.top]);

}int

main()

C語言 字尾表示式轉換(中綴 字尾)

題目描述 輸入乙個中綴表示式,程式設計輸出其字尾表示式,要求輸出的字尾表示式的運算次序與輸入的中綴表示式的運算次序相一致。為簡單起見,假設輸入的中綴表示式由 加 減 乘 除 四個運算符號以及左右圓括號和英文本母組成,其中算術運算子遵守先乘除後加減的運算規則。假設輸入的中綴表示式長度不超過200個字元...

C 利用棧實現中綴表示式轉字尾表示式

題目 現有中綴表示式如 1 2 3 4 10 5 請用棧的特性編寫乙個程式,使得程式輸出字尾表示式 分析如下 step1 1 2 3 4 10 5 首先遇到第乙個輸入是數字1,數字在字尾表示式中都是直接輸出,接著是符號 入棧 step2 1 2 3 4 10 5 第三個字元是 依然是符號,入棧,接著...

中綴表示式 字尾表示式

中綴表示式就是 a b 這樣的,運算子在兩個數的中間 字尾表示式就是 a b 這樣的,運算子在兩個數後面 再細分一下 中綴表示式 字尾表示式 a b c a b c a b c a b c a b c a b c a b c a b c a b c d e a c a b c d e a c emm...