/* 資料結構分析與學習專欄
* 作 者: 高祥
* 完成日期: 2015 年 4 月 5 日
* 版 本 號:011
*任務:使用棧實現表示式求值
*演算法思想:判斷運算子的優先順序並執行相應的操作
*功能:
1.對負數、浮點數均有效
2.可進行多括號的複雜運算
*主要函式:
* 1.void initnumberstack(number &numberstack);//初始化數字棧
* 2.void initoperatorstack(operator &operatorstack);//初始化運算子棧
* 3.void numberpush(number &numberstack,double number);//壓入數字棧
* 4.void numberpop(number &numberstack);//彈出數字棧
* 5.void operatorpush(operator &operatorstack,char op);//壓入運算子棧
* 6.void operatorpop(operator &operatorstack);//彈出運算子棧
* 7.char gettopoperator(operator &operatorstack);//得到運算子棧棧頂元素
* 8.double gettopnumber(number &numberstack);//得到數字棧棧頂元素
* 9.double tonumber(string s);//字串轉換成數字函式
* 10.char precede(char stacktop,char willpush);//判斷運算子的優先順序
* 11.double calculate(double a,double b,char op);//計算
* 12.int isdigit(char ch);//判斷字元是否為數字
*執行示例:
請輸入運算表示式(表達時應當合法且不含空格且負數必須使用括號括起來且以『#』結尾,僅輸入『#』表示退出):
1+2-3+4-5#
運算結果為:-1
請輸入運算表示式(表達時應當合法且不含空格且負數必須使用括號括起來且以『#』結尾,僅輸入『#』表示退出):
1.23+3.45-6.78+9.01#
運算結果為:6.91
請輸入運算表示式(表達時應當合法且不含空格且負數必須使用括號括起來且以『#』結尾,僅輸入『#』表示退出):
1+2*3+4/5-6#
運算結果為:1.8
請輸入運算表示式(表達時應當合法且不含空格且負數必須使用括號括起來且以『#』結尾,僅輸入『#』表示退出):
1+((-3)*3+7.2*5/9)/((-4)*6+25-7/2)+23.9#
運算結果為:26.9
請輸入運算表示式(表達時應當合法且不含空格且負數必須使用括號括起來且以『#』結尾,僅輸入『#』表示退出):#*/
#include#includeusing namespace std;
#define maxsize 100
typedef struct
number;//數字棧型別
typedef struct
operator;//運算子棧型別
void initnumberstack(number &numberstack);//初始化數字棧
void initoperatorstack(operator &operatorstack);//初始化運算子棧
void numberpush(number &numberstack,double number);//壓入數字棧
void numberpop(number &numberstack);//彈出數字棧
void operatorpush(operator &operatorstack,char op);//壓入運算子棧
void operatorpop(operator &operatorstack);//彈出運算子棧
char gettopoperator(operator &operatorstack);//得到運算子棧棧頂元素
double gettopnumber(number &numberstack);//得到數字棧棧頂元素
double tonumber(string s);//字串轉換成數字函式
char precede(char stacktop,char willpush);//判斷運算子的優先順序
double calculate(double a,double b,char op);//計算
int isdigit(char ch);//判斷字元是否為數字
int main()}}
cout<
}return '
case '*':
case '/':
if(willpush=='(')
return '>';
case '(':
if(willpush==')')
return '
case ')':
return '>';
}}double calculate(double a,double b,char op)//計算
}void initnumberstack(number &numberstack)//初始化數字棧
void initoperatorstack(operator &operatorstack)//初始化運算子棧
void numberpush(number &numberstack,double number)//壓入數字棧
void numberpop(number &numberstack)//彈出數字棧
void operatorpush(operator &operatorstack,char op)//壓入運算子棧
void operatorpop(operator &operatorstack)//彈出運算子棧
char gettopoperator(operator &operatorstack)//得到運算子棧棧頂元素
double gettopnumber(number &numberstack)//得到數字棧棧頂元素
int isdigit(char ch)//判斷字元是否為數字
return 0;
}
模擬 表示式求值
給定乙個只包含加法和乘法的算術表示式,請你程式設計計算表示式的值。input 輸入僅有一行,為需要你計算的表示式,表示式中只包含數字 加法運算子 和乘 法運算子 且沒有括號,所有參與運算的數字均為0 到231 1 之間的整數。輸入資料保 證這一行只有0 9 這12 種字元。output 輸出只有一行...
表示式求值(棧)
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 acm隊的mdd想做乙個計算器,但是,他要做的不僅僅是一計算乙個a b的計算器,他想實現隨便輸入乙個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。比如輸入 1 2 4 程式就輸出1.50 結果保留兩位小數 輸入...
棧 表示式求值
核心演算法思想 1.運用兩個棧,乙個存運算子,乙個存數值 2.以 做為標誌位,開頭或者結尾 3.檢查當前字元,若當前字元為數值,則加入數值棧,若為運算子,則檢驗當前運算子的優先順序,1 若當前運算子優先順序大於棧頂優先順序,則把該運算子壓入棧 2 若當前運算子優先順序等於棧頂優先順序 括號的情況 則...