C++四则运算字符串解析(附动图以及动图制作方法)
題目描述
輸入一個(gè)表達(dá)式(用字符串表示),求這個(gè)表達(dá)式的值。
保證字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’,?‘*’,‘/’?,‘(’,?‘)’,‘[’,?‘]’,‘{’?,‘}’。且表達(dá)式一定合法。
輸入:+3+2*{1+2*[-4/(8-6)+7]}
輸出:25
?思路
難點(diǎn):
注意:由于有除法運(yùn)算,應(yīng)該使用double格式來保存計(jì)算結(jié)果
使用到的字符串操作函數(shù)
find()與find_first_of()
| size_t find (const string& str, size_t pos = 0) const noexcept; |
| size_t find (const char* s, size_t pos = 0) const; |
| size_t find (const char* s, size_t pos, size_type n) const; |
| size_t find (char c, size_t pos = 0) const noexcept; |
在當(dāng)前字符串s中搜索傳入?yún)?shù)字符串或者字符在s中首次出現(xiàn)的下標(biāo),與find_first_of()不同的是,find_first_of()找到了首個(gè)匹配的實(shí)例之后就不找了,就認(rèn)定找尋成功,返回首個(gè)字符的下標(biāo),而find()則是要求完全匹配。如果輸入了pos參數(shù),則從下標(biāo)pos開始查找。
查找失敗:返回string::npos
static const size_t npos = -1; //npos is a static member constant value with the greatest possible value for an element of type size_t.?npos是一個(gè)靜態(tài)成員常量,其值為size_t類型的最大值:4294967295,用來表示沒找到元素。
substr()
截取字符串
string substr (size_t pos = 0, size_t len = npos) const;第一個(gè)參數(shù)pos是開始截取的位置下標(biāo),第二個(gè)參數(shù)len是截取的長(zhǎng)度 ,若len==npos,意思是截取字符串從pos直到末尾
stoi()與stod()
將字符串轉(zhuǎn)成int類型或double類型
實(shí)現(xiàn)代碼
#include<iostream> #include<stack> #include<string> using namespace std; string nums = "0123456789"; //比較函數(shù),用于比較當(dāng)前操作符和棧頂操作符的優(yōu)先級(jí) //如果當(dāng)前操作符優(yōu)先級(jí)大于棧頂優(yōu)先級(jí),返回false //如果棧頂操作符為左括號(hào)( //如果當(dāng)前操作符優(yōu)先級(jí)小于棧頂優(yōu)先級(jí),true //還要滿足從左往右計(jì)算順序,如果當(dāng)前操作符與棧頂操作符為同級(jí)關(guān)系,返回true //返回true說明此時(shí)需要將棧頂操作符彈出,用于計(jì)算 bool cmp(char top, char now){if(top == '('){return false;}else if((top == '-' || top == '+') && (now == '*' || now == '/')){return false;}return true; } //計(jì)算,從數(shù)字棧中彈出兩個(gè)數(shù)字,操作符棧中彈出操作符 void calculate(stack<double> &num,stack<char> &op){ // 數(shù)字棧中數(shù)字的順序也有要求 // 第一個(gè)彈出的數(shù)字在后面,第二個(gè)彈出的在前面double b = num.top();num.pop();double a = num.top();num.pop();char c = op.top();op.pop();if(c == '+') a = a+b;else if(c == '-') a = a-b;else if(c == '*') a = a*b;else if(c == '/') a = a/b;//將結(jié)果放入數(shù)字棧num.push(a);return ; } int main(void){string s;while(getline(cin, s)){//數(shù)字棧stack<double> num_stk;//操作符棧stack<char> op_stk;//預(yù)處理,將算式用括號(hào)括起來op_stk.push('(');s += ')';//算式的第一個(gè)應(yīng)該是數(shù)字bool isNextOp = false;for(int i=0; i<s.size(); ++i){//左括號(hào)的話,直接壓入操作符棧,將大中小括號(hào)都當(dāng)做小括號(hào)處理if(s[i] == '(' || s[i] == '[' || s[i] == '{'){op_stk.push('(');}//右括號(hào)的話就可以開始計(jì)算,直到遇到與之對(duì)應(yīng)的左括號(hào)else if(s[i] == ')' || s[i] == ']' || s[i] == '}'){while(op_stk.top() != '(') //計(jì)算calculate(num_stk,op_stk);//彈出此時(shí)的(op_stk.pop();}//除括號(hào)外,數(shù)字和操作符應(yīng)該是間隔排列的,而且算式的第一個(gè)應(yīng)該是數(shù)字//若沒有括號(hào),需要考慮操作符優(yōu)先級(jí)問題,并且是從左往右計(jì)算else if(isNextOp){while(cmp(op_stk.top(),s[i])){//計(jì)算calculate(num_stk,op_stk);}op_stk.push(s[i]);isNextOp = false;}//將數(shù)字從字符串中提取出來else{int j = i;//+ -符號(hào)可能是正負(fù)符號(hào)if(s[j] == '+' || s[j] == '-') ++i;//數(shù)字可能有多位,在0-9中while(nums.find(s[i]) != nums.npos) ++i;//i和j之間的字符即為數(shù)字//將數(shù)字提取,并壓入數(shù)字棧//num_stk.push(stod(nums.substr(j,i-j)));num_stk.push((double)stoi(s.substr(j,i-j)));--i;//當(dāng)前為數(shù)字,所以下一個(gè)為操作符isNextOp = true;}}//數(shù)字棧頂?shù)脑丶礊樽詈蠼Y(jié)果cout<<num_stk.top()<<endl;}return 0; }算法動(dòng)圖
算法動(dòng)圖制作方法
在網(wǎng)上經(jīng)常看見別人寫的算法圖解動(dòng)圖,本以為有專門的軟件可以用,但是沒有找了一圈并沒有發(fā)現(xiàn)這種軟件。
網(wǎng)上的一些動(dòng)圖開源項(xiàng)目:
掘金
https://github.com/MisterBooo/Play-With-Sort-OC
于是自己決定采用土辦法,使用PPT+錄屏軟件來制作算法動(dòng)圖:
發(fā)現(xiàn)一個(gè)很好用的gif錄屏工具:screentogif
下載鏈接:ScreenToGif
首先在PPT中將算法步驟一張一張描繪出來,然后使用gif錄屏軟件制即可:
?當(dāng)前算法PPT下載地址:
圖解PPT
總結(jié)
以上是生活随笔為你收集整理的C++四则运算字符串解析(附动图以及动图制作方法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装design compiler的教程
- 下一篇: 面对肺炎疫情小贴士-IT奶爸带娃记