利用堆疊對表示式求值的方法:
1.設立兩個堆疊,乙個用來儲存運算子,另乙個用來儲存數字。
2.在表示式首尾新增標記運算子,該運算子運算優先順序最低。
3.從左至右依次遍歷字串,若遍歷到運算子,則將其與運算子棧的棧頂元素進行比較,若運算子棧的棧頂運算子優先順序小於該運算子或者此時運算子棧為空,則將該運算子壓入堆疊。遍歷字串中下乙個元素。
4.若運算子棧的棧頂運算子優先順序大於該運算子,則彈出該棧頂運算子,再從數字棧中依次彈出兩個棧頂數字,完成彈出的運算子對應的運算並得到結果後,再將該結果壓入數字棧,重複比較此時棧頂運算子與當前遍歷到的運算子優先順序,視其優先順序大小重複步驟3或步驟4。
5.若遍歷到表示式中的數字,則直接壓入數字棧。
6.若運算子堆疊中僅存有兩個運算子且棧頂元素為我們人為新增的標記運算子,那麼表示式運算結束,此時數字堆疊中唯一的數字即為表示式的值。
#include #include using namespace std;
char str[201];//儲存表示式字串
int mat[5]=;
stackop;//運算子棧,儲存運算子編號
stackin;//數字棧,運算結果可能存在浮點數(除法)
void getop(bool &reto, int &retn, int &i)
if(str[i]==0)
if(str[i]>='0' && str[i]<='9')//計算該數字的數字值
if(str[i]==' ')
}elseelse if(str[i]=='-')else if(str[i]=='*')else
i+=2;//i遞增,跳過該運算子和其後的空格
return;
}return;
}int main()
elseelse
op.push(retnum);//將當前運算子壓入運算子棧}}
if(op.size()==2 && op.top()==0)break;
//若運算子棧只有兩個且其棧頂元素為標記運算子,則表示表示式求值結束
}printf("%.2f\n",in.top());
//輸出數字棧中唯一的數字,即為答案,保留兩位小數
}return 0;
}
九度 27 簡單計算器 棧
不知道為啥這個會報錯deque iterator not dereferencable include include include include using namespace std char str 210 int prio 5 5 stackop 村運算子編號 stacknum 表示式數...
九度 題目1019 簡單計算器
時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 8387 解決 3065 題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。輸入 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束...
九度OJ 題目1019 簡單計算器
題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。輸入 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。輸出 對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位...