日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++四则运算字符串解析(附动图以及动图制作方法)

發布時間:2023/12/8 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++四则运算字符串解析(附动图以及动图制作方法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

輸入一個表達式(用字符串表示),求這個表達式的值。

保證字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’,?‘*’,‘/’?,‘(’,?‘)’,‘[’,?‘]’,‘{’?,‘}’。且表達式一定合法。

輸入:+3+2*{1+2*[-4/(8-6)+7]}

輸出:25

?思路

  • 使用兩個棧來維護計算過程:一個數字棧,用來存儲操作數字;一個操作符棧,用來存儲‘+’,‘-’,?‘*’,‘/’?,‘(’,‘)’,‘[’,?‘]’,‘{’?,‘}’等操作符
  • 如果當前運算符優先級('*/')高于棧頂運算符('+-')優先級,則將運算符入棧;反之,從數字棧中彈出兩個數,從運算符棧中彈出棧頂運算符,進行運算,數字棧壓入運算結果,符號棧壓入當前運算符。重復該操作直到不滿足條件。
  • 出現左括號‘(’,則直接壓入;出現右括號‘)’,則從數字棧中彈出兩個數,從運算符棧中彈出棧頂運算符,進行運算,數字棧壓入運算結果,重復該操作直到棧頂元素為左括號‘(’。
  • 難點:

  • 將數字從字符串中提取出來,而且要考慮正負號
  • 運算符有優先級:有括號先算括號里的,再算乘除,最后加減,要滿足從左往右運算順序
  • 注意:由于有除法運算,應該使用double格式來保存計算結果

    使用到的字符串操作函數

    find()與find_first_of()

    string (1)

    c-string (2)

    buffer (3)

    character (4)

    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;

    string s = "hello world!";cout << s.find('o') << endl;//4cout << s.find('o', 5) << endl;//7cout << s.find("world") << endl;//6cout << s.find("word") << endl;//4294967295,未找到cout << s.find_first_of("word") << endl;//4,“wor” 出現在原字符串中,cout << s.find_last_of('o') << endl;//7

    在當前字符串s中搜索傳入參數字符串或者字符在s中首次出現的下標,與find_first_of()不同的是,find_first_of()找到了首個匹配的實例之后就不找了,就認定找尋成功,返回首個字符的下標,而find()則是要求完全匹配。如果輸入了pos參數,則從下標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是一個靜態成員常量,其值為size_t類型的最大值:4294967295,用來表示沒找到元素。

    substr()

    截取字符串

    string substr (size_t pos = 0, size_t len = npos) const;

    第一個參數pos是開始截取的位置下標,第二個參數len是截取的長度 ,若len==npos,意思是截取字符串從pos直到末尾

    stoi()與stod()

    將字符串轉成int類型或double類型

    實現代碼

    #include<iostream> #include<stack> #include<string> using namespace std; string nums = "0123456789"; //比較函數,用于比較當前操作符和棧頂操作符的優先級 //如果當前操作符優先級大于棧頂優先級,返回false //如果棧頂操作符為左括號( //如果當前操作符優先級小于棧頂優先級,true //還要滿足從左往右計算順序,如果當前操作符與棧頂操作符為同級關系,返回true //返回true說明此時需要將棧頂操作符彈出,用于計算 bool cmp(char top, char now){if(top == '('){return false;}else if((top == '-' || top == '+') && (now == '*' || now == '/')){return false;}return true; } //計算,從數字棧中彈出兩個數字,操作符棧中彈出操作符 void calculate(stack<double> &num,stack<char> &op){ // 數字棧中數字的順序也有要求 // 第一個彈出的數字在后面,第二個彈出的在前面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;//將結果放入數字棧num.push(a);return ; } int main(void){string s;while(getline(cin, s)){//數字棧stack<double> num_stk;//操作符棧stack<char> op_stk;//預處理,將算式用括號括起來op_stk.push('(');s += ')';//算式的第一個應該是數字bool isNextOp = false;for(int i=0; i<s.size(); ++i){//左括號的話,直接壓入操作符棧,將大中小括號都當做小括號處理if(s[i] == '(' || s[i] == '[' || s[i] == '{'){op_stk.push('(');}//右括號的話就可以開始計算,直到遇到與之對應的左括號else if(s[i] == ')' || s[i] == ']' || s[i] == '}'){while(op_stk.top() != '(') //計算calculate(num_stk,op_stk);//彈出此時的(op_stk.pop();}//除括號外,數字和操作符應該是間隔排列的,而且算式的第一個應該是數字//若沒有括號,需要考慮操作符優先級問題,并且是從左往右計算else if(isNextOp){while(cmp(op_stk.top(),s[i])){//計算calculate(num_stk,op_stk);}op_stk.push(s[i]);isNextOp = false;}//將數字從字符串中提取出來else{int j = i;//+ -符號可能是正負符號if(s[j] == '+' || s[j] == '-') ++i;//數字可能有多位,在0-9中while(nums.find(s[i]) != nums.npos) ++i;//i和j之間的字符即為數字//將數字提取,并壓入數字棧//num_stk.push(stod(nums.substr(j,i-j)));num_stk.push((double)stoi(s.substr(j,i-j)));--i;//當前為數字,所以下一個為操作符isNextOp = true;}}//數字棧頂的元素即為最后結果cout<<num_stk.top()<<endl;}return 0; }

    算法動圖

    算法動圖制作方法

    在網上經常看見別人寫的算法圖解動圖,本以為有專門的軟件可以用,但是沒有找了一圈并沒有發現這種軟件。

    網上的一些動圖開源項目:

    掘金

    https://github.com/MisterBooo/Play-With-Sort-OC

    于是自己決定采用土辦法,使用PPT+錄屏軟件來制作算法動圖:

    發現一個很好用的gif錄屏工具:screentogif

    下載鏈接:ScreenToGif

    首先在PPT中將算法步驟一張一張描繪出來,然后使用gif錄屏軟件制即可:

    ?當前算法PPT下載地址:

    圖解PPT

    總結

    以上是生活随笔為你收集整理的C++四则运算字符串解析(附动图以及动图制作方法)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。