題目:
簡單計算器
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 對每個測試用例...