一.實驗目的
通過乙個具體實際應用例子,加深對資料結構課程的理解,能夠綜合利用資料結構以及c語言的知識設計程式,應用到實際問題中去。
二.實驗題目
常見的小型計算器可以通過輸入乙個由運算元和操作符組成的表示式計算出結構,設計乙個程式模擬上述功能。本實驗要求至少建立兩個棧和乙個運算子優先順序比較表,按照運演算法優先順序的不同操作兩個棧,最終實現整個表示式的求值。本程式可以移植到任何乙個小型計算器中。
三.實現提示
1.運算子優先順序表如下圖所示:+-
*/()
#+>
>
<
<
<
>
>
->
>
<
<
<
>
>
*>
>
>
>
<
>
>
/>
>
>
>
<
>
>
(<
<
<
<
< =)
>
>
>
>
>
>
#<
<
<
<
< =
2.從鍵盤上輸入的都是按照字元的形式,而實際的計算過程中需要將其轉化成對應的操作符和運算元,將其轉化可以通過對應的ascii碼表實現,通過查詢ascii碼表來找出字元所對應的運算元以及操作符。
3.表示式中可能含有多位數以及帶小數的數,對這種情況的處理主要是要通過乙個子函式進行,依次讀入字元據直到遇到下乙個運算子結束,然後整體處理整個字串,轉化成資料。而對於帶小數的情況則需要將整數部分和小數部分分開按照前述過程處理,最後再將兩部分合併。
四.思考及選做
1.需要注意的是在程式實際執行的時候,對於有小數部分的情況計算的結果會出現截斷誤差,也就是說計算出的值有捨入情況,注意這一現象,深入理解計算機進行科學計算的本質。
五.我的實現
[cpp]view plain
copy
#include
#include
#include
#define error 0
#define ok 1
#define overflow -1
#define stack_init_size 100
#define stackincrement 10
#define opsetsize 7
typedef
intstatus;
/*算符間的優先關係
*/char
opset[opsetsize]=;
unsigned char
prior[7][7] = ;
/*順序棧結構模板
*/template
<
typename
t>
struct
sqstack
; /*
初始化棧函式模板
*/template
<
typename
t1,typename
t2>
status initstack(t1 &s)
/*入棧函式模板
*/template
<
typename
t1,typename
t2>
status push(t1 &s,t2 e)
*s.top++=e;
return
ok;
} /*
出棧函式模板
*/template
<
typename
t1,typename
t2>
status pop(t1 &s,t2 &e)
/*獲取棧頂元素模板
*/template
<
typename
t1,typename
t2>
t2 gettop(t1 s)
/*判斷是否為運算子
*/status in(char
test,
char
* testop)
return
find;
} /*
運算 */
float
operate(
float
a,unsigned
char
theta,
float
b)
} /*
returnopord和precede組合,判斷運算子優先順序
*/int
returnopord(
char
op,char
* testop)
return
0;
} char
precede(
char
aop,
char
bop)
/* 算術表示式求值的算符優先演算法。
設optr和opnd分別為運算子棧和運算數棧,opset為運算子集合。
*/float
evaluateexpression()
}
else
} }
return
gettopfloat
>,
float
>(opnd);
} int
main()
資料結構 表示式求值
程式 如下 1 include 2 include 3 include 45 define stack init size 100 6 define stackincrement 10 7 define overflow 2 8 define ok 1 9 define error 0 1011 t...
資料結構 表示式求值
題目鏈結 題目描述 給出乙個表示式,其中運算子僅包含 加 減 乘 整除 乘方 要求求出表示式的最終值。資料可能會出現括號情況,還有可能出現多餘括號情況。資料保證不會出現大於或等於2 31 231的答案。資料可能會出現負數情況。輸入格式 輸入僅一行,即為表示式。輸出格式 輸出僅一行,既為表示式算出的結...
資料結構 表示式求值 1
在乙個表示式中,只有 0 9 請求出表示式的值。用整數除法 輸入格式 共1 行,為乙個算式。算式長度 30 其中所有資料在 0 2 31 1的範圍內 輸出格式 共一行,為表示式的值。輸入樣例 在這裡給出一組輸入。例如 1 3 2 7 2 69 2 輸出樣例 在這裡給出相應的輸出。例如 include...