資料結構課程設計——算術表示式的求值1.在課程設計中提高學生的動手能力和程式設計能力;
2.在課程設計中提高資料結構中理論知識(棧和二叉樹等知識)的應用。
3.在課程設計中提高自己對各個方面知識的綜合能力。
乙個算術表示式是由運算元(operand)、運算子(operator)和界限符(delimiter)組成的。假設運算元是正實數,運算子只含加減乘除等四種運算子,界限符有左右括號和表示式起始、結束符「#」,如:#(7+15)*(23-28/4)#。引入表示式起始、結束符是為了方便。程式設計利用「運算子優先法」求算術表示式的值。
1.設計建立二叉樹的標頭檔案(bitree.h);
2.設計程式中需要用到的棧的相關標頭檔案(stack.h);
3.設計乙個函式去判斷符號的優先順序(strpriority());
4.設計函式去判斷是否輸入的字元是否為運算子或者界符(is_operator());
5.通過輸入的字串陣列去建立表示式樹(initexptree());
6.設計乙個函式去實現運算(getstrvalue());
7.設計乙個函式去將輸入的數字型的字串轉換成double型(tonumber());
8.設計乙個函式去實現通過二叉樹遍歷進行運算結果求值(evalateexptree());
9.為了保證程式的健壯性,根據可能的錯誤可能性全部錯誤結果進行列印錯誤型別(errortest());
10.為了判斷是否要列印最終的結果,定義了乙個標誌is_success去進行判斷。
win10計算機一台
(1) 從鍵盤或檔案讀入乙個合法的算術表示式,輸出正確的結果。
(2) 顯示輸入序列和棧的變化過程。
(3) 考慮演算法的健壯性,當表示式錯誤時,要給出錯誤原因的提示。
#pragma once
#include
using
namespace std;
typedef
struct bitnode
bitnode,
*bitree;
void
createexptree_op
(bitree &t, bitree a, bitree b,
char theta)
//a是左孩子,b是右孩子,theta是符號域
void
createexptree_number
(bitree &t, bitree a, bitree b, string theta)
//a是左孩子,b是右孩子,theta是數字域
#pragma once
#include
"bitree.h"
#include
"stack.h"
typedef
struct stacknode
stacknode,
*linkstack;
intinitstack
(linkstack &s)
//棧的初始化
intpush_expt
(linkstack &s, bitree e)
//二叉樹入棧
intpush_optr
(linkstack &s,
char e)
//運算子入棧
intpop_expt
(linkstack &s, bitree &t1)
//二叉樹出棧
intpop_optr
(linkstack &s,
char
&ch)
//運算子出棧
char
gettop_optr
(linkstack s)
//取棧頂符號
bitree gettop_expt
(linkstack s)
//取棧頂樹
#include
#include
#include
#include
"bitree.h"
#include
"stack.h"
using
namespace std;
bool is_success =
true
;//成功標誌
int oparraylength =1;
//定義輸入陣列的長度
char
strpriority
(char top,
char ch)
//判斷符號的優先順序
else
if(top ==
'*'|| top ==
'/')
return
'>'
;else
return
'0';
}void
initexptree
(char
*str, linkstack &expt, linkstack &optr)
//建立樹
createexptree_number
(t,null
,null
, number)
;//建立只有乙個元素的二叉樹
number ="";
//建完數值的二叉樹後number置空
push_expt
(expt, t);if
(t->number!=
"")cout << t-
>number <<
"已出expt棧"
<< endl;
i++;}
else
//如果它是符號,執行下列語句}}
}double
getstrvalue
(char data,
double lvalue,
double rvalue)
//計算表示式的值
}double
tonumber
(string str)
//把string字元轉換成數值
return sum;
}double
evaluateexptree
(bitree t)
//遍歷表示式樹求表示式的值
}void
errortest
(char
*str1)
//錯誤判斷
j++;}
j =1;
//重置為1if(
!wrong_flag)if(
(str1[j]
=='+'
|| str1[j]
=='-'
|| str1[j]
=='/'
|| str1[j]
=='*'
)&& str1[j +1]
==')')if
((str1[j +1]
=='+'
|| str1[j +1]
=='-'
|| str1[j +1]
=='/'
|| str1[j +1]
=='*'
)&& str1[j]
=='(')if
((str1[j]
=='+'
|| str1[j]
=='-'
|| str1[j]
=='*'
|| str1[j]
=='/')&&
(str1[j +1]
=='+'
|| str1[j +1]
=='-'
|| str1[j +1]
=='*'
|| str1[j +1]
=='/'))
j++;}
j =1;
//重置為1
if(left != right)}}
void
mainrun
(linkstack expt,linkstack optr,bitree t,
char
*oparray)
cout <<
" is: "
<<
evaluateexptree
(t)<< endl;
//求值結果}}
1.通過課程設計中不斷的查詢相關資料,提高了自己對陌生知識的理解和掌握。
2.課程設計中大量用到了棧,增強自己對棧的相關知識的理解和應用。
3.提高了自己對程式健壯性判斷的重要性,如果沒有對錯誤進行判斷,很容易出現編譯器直接報錯的情況。
算術表示式求值 資料結構 C語言
1.實驗目的 熟練掌握棧的基本操作,深入了解棧的特性,能在實際問題的背景下靈活運用他們,並加深對這種結構的理解。2.實驗內容 設計乙個程式,演示用算符優先法對算術表示式求值的過程。以字串行的形式從終端輸入語法正確的 不含變數的整數表示式。利用教科書表3.1給出的算符優先關係,實現對算術四則運算混合運...
資料結構課程設計 算術表示式求值
題目 編制乙個用算符優先法對算術表示式求值的程式 evaluate expression include include includeusing namespace std int a 7 7 存放運算子的優先順序,3為 2為 1為 bool isoperator char optr 判斷是否操作...
資料結構之 用C 實現算術表示式求值
基本功能 利用棧實現整數的加減乘除運算。使用方法 輸入表示式之後再輸入 表示表示式結束,如下圖 缺點 不能進行小數的運算 如下 include include include using namespace std define maxnum 50 class stack for number fl...