從鍵盤上輸入一算術表示式(中綴白大師),包括圓括號,計算出表示式的值。
要求:程式對所輸入的表示式作簡單判斷,如有錯給出提示;
實現算術四則運算(+、-、*、/
)和平方(^
)運算,能處理雙目運算子:+
和-
;
能將中綴算術表示式轉換成字尾表示式並輸出,並輸出運算結果。
2.1 概要簡述
中綴表示式轉為字尾表示式,從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序低於找頂符號(乘除優先加減)則棧頂元素依次出找並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。
字尾表示式也稱為逆波蘭表示式,計算方法為:新建乙個表示式,如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後,棧裡的就是結果。
2.2 儲存結構表示
typedef
struct
opstack;
typedef
struct
stack;
2.3 詳細設計
2.3.1 判斷中綴表示式是否合理
//判斷中綴表示式是否合理
bool
judge_infix
(char str)
else
if(str[i]
==')')}
if(temp==0)
return
true
;return
false
;}
2.3.2 中綴表示式轉換為字尾表示式
建立棧從左向右順序遍歷中綴表示式:
將棧中剩餘的符號依次輸出。
//中綴表示式轉字尾表示式
void
translateexpress
(char str,
char exp)
pop(
&s,&e)
;break
;case
'+':
case
'-':
while(!
stackempty
(s)&&
gettop
(s,&e)
&&e!=
'(')
push
(&s,ch)
;break
;case
'*':
case
'/':
while(!
stackempty
(s)&&
gettop
(s,&e)
&&e==
'/'||e==
'*'||e==
'^')
push
(&s,ch)
;break
;case
'^':
while(!
stackempty
(s)&&
gettop
(s,&e)
&&e==
'^')
push
(&s,ch)
;break
;case
' ':
break
;default
:while
(ch>=
'0'&&ch<=
'9')
i--; exp[j++]=
' ';
} ch=str[i++];
}while(!
stackempty
(s))
exp[j]
='\0'
;}
2.3.3 計算字尾表示式值
依次遍歷棧
檢測是否是數字,是數字就壓棧,是操作符從棧中依次取出當前運算元的右運算元和左運算元與當前操作符進行運算,結果壓棧。
遍歷結束,執行結果就是棧頂元素。
//計算表示式值
double
computeexpress
(char a)
s.top++
; s.data[s.top]
=value;
}else
i++;}
}if(!s.top!=-1)}}
3.1 判斷表示式是否正確
3.2 簡單四則運算
3.3 含平方運算
//初始化棧
void
initstack
(stack *s)
//取棧頭
intgettop
(stack s,
char
*e)}
//出棧操作
void
pop(stack *s,
char
*e)//入棧操作
void
push
(stack *s,
char e)
//判斷棧空
intstackempty
(stack s)
//計算表示式值
double
computeexpress
(char a)
s.top++
; s.data[s.top]
=value;
}else
i++;}
}if(!s.top!=-1
)}}//中綴表示式轉字尾表示式
void
translateexpress
(char str,
char exp)
pop(
&s,&e)
;break
;case
'+':
case
'-':
while(!
stackempty
(s)&&
gettop
(s,&e)
&&e!=
'(')
push
(&s,ch)
;break
;case
'*':
case
'/':
while(!
stackempty
(s)&&
gettop
(s,&e)
&&e==
'/'||e==
'*'||e==
'^')
push
(&s,ch)
;break
;case
'^':
while(!
stackempty
(s)&&
gettop
(s,&e)
&&e==
'^')
push
(&s,ch)
;break
;case
' ':
break
;default
:while
(ch>=
'0'&&ch<=
'9')
i--; exp[j++]=
' ';
} ch=str[i++];
}while(!
stackempty
(s))
exp[j]
='\0';}
//判斷中綴表示式是否合理
bool
judge_infix
(char str)
else
if(str[i]
==')')}
if(temp==0)
return
true
;return
false;}
intmain()
else
translateexpress
(a,b)
;printf
("字尾表示式為: %s\n"
,b);
f=computeexpress
(b);
printf
("計算結果為: %f\n"
,f);
system
("pause");
return0;
}
c語言課程設計 計算器
include include include define pi 3.14159265358979323846264338327 define max 20 define e 2.71828 載入進入計算器需要輸入的指令 void initnews 加法 void sum double x,dou...
資料結構課程設計
資料結構課程設計 include define n 30 include include includeusing namespace std struct node typedef node phone,mingzi node hashnumble node hashname int hash1 ...
資料結構課程設計
小明是乙個計算機專業top student 祝賀他畢業了。並準備到銀行參加工作。上班第一天,經理叫他編制乙個實現乙個活期儲蓄處理程式,算作考查。上班第一天,一定要給領導乙個好印象,小明二話沒說,就答應了。現要你是小明了,請完成如下題目功能。儲戶開戶 銷戶 存入 支出活動頻繁,系統設計要求 1 能比較...