在王道論壇《計算機考研——機試指南》中例題3.2用比較繁瑣的方法實現了簡單計算器,他的優點在於可以進行擴充套件,本人想實現乙個帶括號的計算器,其他要求和九度1019的題目一致。
在原本基礎上的改進:
引入左右括號的優先順序,左括號優先順序高於乘除法,右括號的優先順序低於加減法,高於人為定義的標記運算子
左括號像乙個圍牆可以擋住括號內的運算出來,右括號像大炮一路前進,一直到吃掉左括號
原先**及其注釋參見原書45,46頁,我改動的部分有注釋說明
在改動的過程中,忽視了乙個問題,如果以括號結尾,不能按照原來**直接加2,這樣會跳過空字元0
出現的問題就是,第乙個字串比第二個字串長,長出來的部分會在第二個字串遍歷時候遍歷到,出現這個問題的原因和gets有關
gets(str)會將螢幕中的字元列印到str中,字串的末尾置0作為結束 ,連續讀取,如果第乙個字串比第二個長,長出來的那一部分不會覆蓋
解決問題的方法有兩個:
1.使用memset(str, 0, sizeof(str)); 將字串清空,第二遍讀取就不會受到第一遍的影響;
2.像原來程式中處理數字字元一樣,索引不直接加2,先加1進行判斷
#include#include#includeusing namespace std;
int mat[7]=;
char str[202];
stackop;
stackin;
stackpy;
void getop(bool &reto,int &retn,int &i)
if(str[i]==0)
if(str[i]<='9'&&str[i]>='0')
if(str[i]==' ') i++;
return;
} else
else if(str[i]=='-')
else if(str[i]=='*')
else if(str[i]=='/')
else if(str[i]=='(')
else if(str[i]==')')
reto=true;
i+=1;
if(str[i]==' ') i++; //如果以括號結尾,括號後面緊接著0,i+2 會跳過0
return; }
}int main();
while(!in.empty());
while(true)
else
else //如果當前運算子是右括號,說明之間的四則運算都結束,將左括號彈出棧
break;
}int ret=op.top();op.pop();
double b=in.top();in.pop();
double a=in.top();in.pop();
if(ret==2)
else if(ret==3)
else if(ret==4)
else if(ret==5);
in.push(tmp);
}if(retnum!=1) op.push(retnum); //如果是左括號,不需要壓入棧}}
if(op.size()==2&&op.top()==0) break;
} printf("%.2f\n",in.top());
// memset(str, 0, sizeof(str)); }
}
九度 題目1019 簡單計算器
時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 8387 解決 3065 題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。輸入 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束...
九度OJ 題目1019 簡單計算器
題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。輸入 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。輸出 對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位...
九度OJ 1019 簡單計算器
include include include include include include include using namespace std 九度 1019 簡單計算器 10 9 2014 liu 1 將中綴表示式轉換成字首表示式或者是字尾表示式 mapmapoperator int ge...