HDU 1237 簡單計算器

2021-09-22 19:49:50 字數 3374 閱讀 9504

題目:

簡單計算器

problem description

讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。

input

測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。

output

對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。

sample input

1 + 2

4 + 2 * 5 - 7 / 11

0sample output

3.00

13.36

題解:用程式設計實現計算機問題。很是經典的題目了。

中綴表示式轉為字尾表示式用運算子棧,

計算字尾表示式用數字棧。

先把中綴表示式轉為字尾表示式,其規則為:

從左向右遍歷中綴表示式的每個數字和符號。

1.若是數字就輸出,即成為字尾表示式的一部分。

2.棧空時,遇到運算子,直接入棧。

3.遇到左括號將其入棧。

4.遇到右括號:執行出棧操作,輸出到字尾表示式,直到彈出的是左括號。(注意:括號不輸出到字尾表示式)

5.遇到其他運算子,彈出所有優先順序大於或等於該運算子的棧頂元素,然後該運算子入棧。

#include

#include

#include

using

namespace std;

intcompare

(char);

void

estimate

(char);

string expression;

stack<

char

> stackoperator;

intmain()

//for

while

(stackoperator.

empty()

!=1) cout << expression << endl;

expression.

clear()

;return0;

}//判斷符號的優先順序

intcompare

(char a)

void

estimate

(char a)

stackoperator.

push

(a);

//把該符號放到棧中

}//else if

else stackoperator.

push

(a);

}

再計算字尾表示式

其規則為:從左到右遍歷表示式的每個數字和符號

1.遇到數字就進棧。

2.遇到符號,就將處於棧頂兩個數字出棧,進行運算,運算結果進棧。

直到遍歷完整個表示式。此時棧中一定只有乙個數字,該數字就是結果。

注意:要清楚字元型別和double型別的互化

double

calculate

(string s)

//for

i = k -1;

stackdigital.

push

(stod

(temp1));

}else

if(s[i]

==' '

)continue

;else

//如果是符號

//cout << s[i] << " ";

}//else

}

ac**:

#include

#include

#include

#include

using

namespace std;

intcompare

(char);

void

estimate

(char);

double

calculate

(string)

;string expression;

stack<

char

> stackoperator;

intmain()

else

if(t[i]

>=

'0'&&t[i]

<=

'9')

//如果是數字

else

}//for

//cout << "stackoperator.size()=" << stackoperator.size() << endl;

//cout << "stackoperator.empty()=" << stackoperator.empty() << endl;

while

(stackoperator.

empty()

!=1)//把棧中剩餘的內容彈到字尾表示式

//cout << expression << endl;

printf

("%.2f\n"

,calculate

(expression));

expression.

clear()

;}return0;

}//判斷符號的優先順序

intcompare

(char a)

void

estimate

(char a)

elseif(

compare

(a)<=

compare

(stackoperator.

top())

)//如果該符號的優先順序不高於棧頂符號的優先順序

stackoperator.

push

(a);

//把該符號放到棧中

}//else if

else

}double

calculate

(string s)

//for

i = k -1;

stackdigital.

push

(stod

(temp1));

}else

if(s[i]

==' '

)continue

;else

//如果是符號

//cout << s[i] << " ";

}//else

}//cout << stackdigital.size() << endl;

return stackdigital.

top();

}

hdu1237 簡單計算器

模擬棧運算,其實遞迴也可以,不過我夠嗆能寫的出來 其實老早就看過表示式求值的問題,只不過一直沒有敲過,今天敲了一下,發現還是有不少問題的 code include include include using namespace std bool check char,char void solve ...

hdu 1237 簡單計算器

模擬棧。設兩個陣列,乙個裝運算元,乙個裝操作符。根據優先順序,先乘除,後加減。include include include include char s 210 op 200 s1 200 double a 200 int char num char s1,int n 字串轉化成int型數 ret...

HDU1237 簡單計算器

problem description 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。input 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。output 對每個測試用例...