資源簡介
一、問題描述
在控制臺下實現一個對算術表達式求值的模擬程序。
二、基本要求
該演示程序具有如下基本功能:
(1) 表達式輸入,以字符序列的形式從終端輸入一個語法正確的數值表達式(float型),且表達式中只含有+、-、*、/、( 、)6 種運算符,輸入格式如下:
……
例如表達式:
100+(15/3)*2
輸入格式為:
100+(15/3)*2
注意:
輸入的表達式中間不含空格。
(2) 表達式結果的輸出,輸出形式為:
=
例如表達式:
100+(15/3)*2
輸出形式為:
100+(15/3)*2 = 110
注意:
此處的輸出結果為整個表達式的數值結果。
(3) 數據合法性檢驗
主要是針對原表達式中除數為 0 的情況。
三、界面效果
表達式求值模擬程序
功能菜單:
==============
[1] 輸入表達式并求值
[0] 退出
==============
請輸入你的選擇 (0~1):1
請輸入一個表達式 :
100+(15/3)*2
計算結果如下:
100+(15/3)*2 = 110
請輸入你的選擇 (0~1):0
四、測試數據
(1) 8 =
(2) 1+2+3+4 =
(3) 88-1*5 =
(4) 1024/4*8 =
(5) 1024/(4*8) =
(6) (20+2)*(6/2) =
(7) 3-3-3 =
(8) 80/(9-9) =
(9) (6+2*(3+6*(6+6)) =
(10) (((6+6)*6+3)*2+6)*2 =
五、實現提示
(1) 設置運算符棧和操作數棧輔助分析算符優先關系;
(2) 在讀入字符序列時,完成運算符和操作數的處理,以及相應運算;
(3) 在識別處運算數的同時,要將其字符序列形式轉化成 float 型數據形式;
(4) 輸入的字符序列中,操作數不一定是一位數,可能是多位數,如 16+32 ;
(5) 使用 Lab3-1 實現的棧的 ADT 基本操作完成本次作業 ;
(6) 在程序中會用到兩類棧:操作數棧和運算符棧,分別為 float 型數據和字符型數據,
思考在同一個程序中如何處理兩類不同的數據類型?
(7) 算符之間的優先關系參考課本 P53 頁表 3.1 。

代碼片段和文件信息
/***
*DynaSeqStack.cpp?-?動態順序棧,即棧的動態順序存儲實現
*
*
*題目:表達式求值
*
*班級:A1?北極
*
*姓名:邱繼穎
*
*學號:2008010829
*
****/
#include?
#include?
#include?
#include?
#include?“DynaSeqStack.h“
const?int?STACK_INIT_SIZE?=?100; //?初始分配的長度
const?int?STACKINCREMENT??=?10; //?分配內存的增量
/*------------------------------------------------------------
操作目的: 初始化棧
初始條件: 無
操作結果: 構造一個空的棧
函數參數:
SqStack?*S 待初始化的棧
返回值:
bool 操作是否成功
------------------------------------------------------------*/
bool?InitStack(SqStack?*S)
{
assert(S?!=?NULL);
S->base?=?(ElemType*)malloc(sizeof(ElemType)?*?STACK_INIT_SIZE);
if(S->base?==?NULL) return?false;
S->top?=?S->base;
S->stacksize?=?STACK_INIT_SIZE;
return?true;
}
/*------------------------------------------------------------
操作目的: 銷毀棧
初始條件: 棧S已存在
操作結果: 銷毀棧S
函數參數:
SqStack?*S 待銷毀的棧
返回值:
無
------------------------------------------------------------*/
void?DestroyStack(SqStack?*S)
{
assert(S?!=?NULL);
free(S->base);
S->top?=?S->base?=?NULL;
}
/*------------------------------------------------------------
操作目的: 判斷棧是否為空
初始條件: 棧S已存在
操作結果: 若S為空棧,則返回true,否則返回false
函數參數:
SqStack?S 待判斷的棧
返回值:
bool 是否為空
------------------------------------------------------------*/
bool?StackEmpty(SqStack?S)
{
assert((S.base?!=?NULL)?&&?(S.top?!=?NULL));
return(S.base?==?S.top);
}
/*------------------------------------------------------------
操作目的: 得到棧的長度
初始條件: 棧S已存在
操作結果: 返回S中數據元素的個數
函數參數:
SqStack?S 棧S
返回值:
int 數據元素的個數
------------------------------------------------------------*/
int?StackLength(SqStack?S)
{
assert((S.base?!=?NULL)?&&?(S.top?!=?NULL));
return(S.top-S.base);
}
/*------------------------------------------------------------
操作目的: 得到棧頂元素
初始條件: 棧S已存在
操作結果: 用e返回棧頂元素
函數參數:
SqStack?S 棧S
ElemType?*e 棧頂元素的值
返回值:
bool 操作是否成功
------------------------------------------------------------*/
bool?GetTop(SqStack?S?ElemType?*e)
{
assert((S.base?!=?NULL)?&&?(S.top?!=?NULL));
if(StackEmpty(S))
return?false;
*e?=?*(S.top-1);
return?true;
}
/*------------------------------------------------------------
操作目的: 遍歷棧
初始條件: 棧S已存在
操作結果: 依次對S的每個元素調用函數fp
函數參數:
SqStack?S 棧S
void?(*fp)() 訪問每個數據元素的函數指針
返回值:
無
------------------------------------------------------------*/
void?StackTraverse(SqStack?S?void?(*fp)(ElemType))
{
assert((S.base?!=?NULL)?&&?(S.top?!=?NULL));
for(;?S.basese++)
(*fp)(*S.base);
}
/*------------------------------------------------------------
操作目的: 壓棧——插入元素e為新的棧頂元素
初始條件: 棧S已存在
操作結果: 插入數據元素e作為新的棧頂
函數參數:
SqStack?*S 棧S
ElemType?e 待插入的數據元素
返回值:
bool 操作是否成功
------------------------------------------------------------*/
bool?Push(SqStack?*S?ElemType?e)
{
if(S?==?NULL) return?false;
assert((S->base?!=?NULL)?&&?(S->top?!=?NULL));
//?validate?overflow
if(StackLength(*S)?==?S->stacksize)
{
El
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4331??2009-10-29?12:00??表達式求值\DynaSeqStack.cpp
?????文件????????881??2009-10-27?08:49??表達式求值\DynaSeqStack.h
?????文件????????147??2009-10-29?23:17??表達式求值\ElemType.cpp
?????文件????????267??2009-10-29?19:49??表達式求值\ElemType.h
?????文件???????3245??2009-10-30?10:49??表達式求值\Lab.cpp
?????目錄??????????0??2009-10-30?11:08??表達式求值
-----------?---------??----------?-----??----
?????????????????8871????????????????????6
- 上一篇:復雜背景下車牌識別系統GUI.zip
- 下一篇:通訊錄管理系統(c 鏈表)
評論
共有 條評論