九度1019簡單計算器到帶括號的計算器

2021-07-28 22:20:07 字數 1708 閱讀 8973

在王道論壇《計算機考研——機試指南》中例題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...