棧模擬表示式求值

2021-06-29 14:40:33 字數 3203 閱讀 7807

/*   資料結構分析與學習專欄

* 作 者: 高祥

* 完成日期: 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 若當前運算子優先順序等於棧頂優先順序 括號的情況 則...