題目:點此
思路:{
先讀入,再回圈{
如果是空格{
如果index≠0(空格前一個字符是數字){
如果這個數字是浮點數(flot=true){
index除以10w*,
w清零,flot重置,
}
index入data堆疊,index清零,
前一個運算子的運算元個數++;
如果個數=2{
計算;計算方法點此,
}
}
如果是運算子{
入symbol堆疊,此運算子的運算元賦為0;
}
如果是小數點{
flot賦為true;
}
如果flot是true{
小數位數(w)++;
}
index乘十加此數,
}
輸出data堆疊堆疊頂,
}
計算方法{
將b賦為data堆疊堆疊頂,data堆疊出堆疊,
將a賦為data堆疊新的堆疊頂,data堆疊出堆疊,
取出symbol堆疊堆疊頂運算子,將a和b作為運算元計算,將結果壓入data堆疊中,
如果symbol堆疊不空{
堆疊頂運算元個數++;
如果運算元個數為2{
計算;
}
}
}
犯的錯誤{
1.應該用getline(cin,a)讀入字串,我用了cin,
2.type要存一個小數,型別應該是float,
3.快速冪沒有寫邊界條件,
}
識訓{
1.注意精度,
2.cin只讀到空格、tab、回車處,讀一行要用getline,
3.注意整數除以整數,結果還是整數,存小數要用浮點數,
}
還有一種更好的思路:{
可以用一個堆疊S2來實作計算,掃描從右往左進行, 如果掃描到運算元,則壓進S2,如果掃描到運算子,則從S2彈出兩個運算元進行相應的操作,并將結果壓進S2(S2的個數出2個進1個), 當掃描結束后,S2的堆疊頂就是運算式結果, } #include <iostream>#include <stack>
#include <cstdio>
using namespace std;
struct ci{
char index;
int times;
};
stack <double> data;
stack <ci> symbol;
void math(){
double b=data.top();
data.pop();
double a=data.top();
data.pop();
double index;
switch(symbol.top().index){
case '+':index=a+b;break;
case '-':index=a-b;break;
case '/':index=a/b;break;
case '*':index=a*b;break;
}
data.push(index);
symbol.pop();
if(!symbol.empty()){
symbol.top().times++;
if(symbol.top().times==2){
math();
}
}
}
int ksm_10(int r){
if(r==0){
return 1;
} int index=1;
if(r%2!=0){
index*=10;
}
int type=ksm_10(r/2);
index*=(type*type);
return index;
} int main(){
string a;
getline(cin,a);
bool flot=false;
int w=0;
double index=0;
a.push_back(' ');
for(int i=0;i<a.length();i++){
// cout << i << " ok\n";
if(a[i]==' '){
if(index!=0){
if(flot){
index/=ksm_10(w);
flot=false;
w=0;
}
data.push(index);
// cout << index << "\n";
index=0;
symbol.top().times++;
if(symbol.top().times==2){
math();
}
}
continue;
}
// cout << i+1 << " not space\n";
if(a[i]=='+'||a[i]=='-'||a[i]=='/'||a[i]=='*'){
ci g;
g.index=a[i];
g.times=0;
symbol.push(g);
// cout << "ok\n";
continue;
}
//cout << i << " not symbol\n";
if(a[i]=='.'){
flot=true;
continue;
}
// cout << i << " not dot\n";
if(flot){
w++;
}
index*=10;
index+=a[i]-'0';
}
printf("%lf",data.top());
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/75525.html
標籤:C++
上一篇:C++代做,C++編程代做,C++程式代做,留學生C++ Lab代寫
下一篇:讀入字串的方法
