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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode224 基本加减计算器-双栈和状态转换

發(fā)布時間:2025/4/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode224 基本加减计算器-双栈和状态转换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目

實現(xiàn)一個基本的計算器來計算一個簡單的字符串表達(dá)式的值。
字符串表達(dá)式可以包含左括號 ( ,右括號 ),加號 + ,減號 -,非負(fù)整數(shù)和空格 。

示例 1: 輸入: "1 + 1" 輸出: 2 示例 2: 輸入: " 2-1 + 2 " 輸出: 3 示例 3: 輸入: "(1+(4+5+2)-3)+(6+8)" 輸出: 23

說明:
你可以假設(shè)所給定的表達(dá)式都是有效的。
請不要使用內(nèi)置的庫函數(shù) eval。

來源:力扣(LeetCode)
鏈接:Leetcode224基本計算器

思路:

采用雙棧,一個是數(shù)值棧number_stack;另一個操作符棧operation_stack來進(jìn)行計算。

整個過程引入三個狀態(tài)進(jìn)行轉(zhuǎn)換:state_begin,number_state,operation_state,轉(zhuǎn)換關(guān)系如下圖。

圖片:來源小象學(xué)院B站視頻

  • state_begin是默認(rèn)狀態(tài),數(shù)字則跳轉(zhuǎn)到number_state,左括號則跳轉(zhuǎn)到operation_state
  • number_state處理的是數(shù)字,則進(jìn)行字符串轉(zhuǎn)換為數(shù)字;此外,壓棧并且計算,控制跳轉(zhuǎn)到operation_state
  • operation_state處于該狀態(tài)的i,需要分情況處理,如上圖。
  • 代碼

    #include<iostream> #include<string> #include<stack> using namespace std;class Solution { public: //計算加和減法void compute(stack<int> &number_stack,stack<char> &operation_stack){int num2,num1;if(number_stack.size()<2)return;//只有一個數(shù)的情況num2=number_stack.top();number_stack.pop();num1=number_stack.top();number_stack.pop();if(operation_stack.top()=='+')number_stack.push(num1+num2);else if(operation_stack.top()=='-')number_stack.push(num1-num2);operation_stack.pop();//該運(yùn)算符出棧}//int calculate(string s) {static const int state_begin=0;//三個狀態(tài)變量static const int number_state=1;static const int operation_state=2;std::stack<int> number_stack;std::stack<char> operation_stack;int number =0;//進(jìn)行壓棧操作使用int state=state_begin;//初始狀態(tài)int compute_flag=0;//可以進(jìn)行運(yùn)算的標(biāo)記,=1表示可進(jìn)行運(yùn)算for(int i=0;i<s.length();i++){if(s[i]==' ')continue;//有空格時候的處理switch(state)//三個狀態(tài)的控制{case state_begin://初始狀態(tài)if(s[i]>='0'&&s[i]<='9')state=number_state;else state=operation_state;i--;break;case number_state://處理字符串轉(zhuǎn)化為數(shù)字if(s[i]>='0'&&s[i]<='9'){number=number*10+s[i]-'0';//轉(zhuǎn)化為數(shù)字}else//這個狀態(tài)下會遇到+-{number_stack.push(number);//把“+”“-”前面的數(shù)字入棧if(compute_flag==1)//查看是否可以計算compute(number_stack,operation_stack);number=0;//因為已經(jīng)完成入棧操作,此時number設(shè)為零 i--;//指針退格,因為此時i指的是加號或者減號state=operation_state;//狀態(tài)轉(zhuǎn)換}break;case operation_state://操作符狀態(tài)if(s[i]=='+'||s[i]=='-')//遇到的是加號或減號{//加減法符號入棧operation_stack.push(s[i]);compute_flag=1;//可計算標(biāo)志賦值1}else if(s[i]=='('){//左括號后面跟著的是數(shù)字state=number_state;compute_flag=0;}else if(s[i]>='0'&& s[i]<='9'){//是數(shù)字,需要轉(zhuǎn)換到number_state處理,所以i--重新進(jìn)入switchstate=number_state;i--;}else if(s[i]==')'){//右括號可以計算compute(number_stack,operation_stack);}break;}}if(number!=0)//只有一個元素的情況和其他情況{number_stack.push(number);compute(number_stack,operation_stack);}if(number==0&&number_stack.empty())return 0;return number_stack.top(); //返回棧頂元素}};int main() {string s="1+121-(14+(5-6))";Solution solve;cout<<solve.calculate(s)<<endl;}

    測試結(jié)果


    這是表達(dá)式s="1+121-(14+(5-6))"的值。

    總結(jié)

    本題在leetcode中標(biāo)記為hard難度,這里采用的是有限狀態(tài)轉(zhuǎn)換法。

    每個狀態(tài)作何處理,這個需要想清楚。
    同時需要注意的是指針的退格,這里的 循環(huán)遍歷 i 起到指針的作用。
    比如,第i個字符進(jìn)入操作符狀態(tài)(operation_state),如果它是數(shù),不是±符號,我們需要將其狀態(tài)轉(zhuǎn)變(number_state),然后讓該位置i重新進(jìn)入到switch中,這里就需要指針的退格(i- -) 。

    進(jìn)行棧內(nèi)運(yùn)算時,需要設(shè)置標(biāo)記位,遇到右括號可以進(jìn)行計算。

    參考資料

    B站leetcode刷題視頻av29912609

    總結(jié)

    以上是生活随笔為你收集整理的Leetcode224 基本加减计算器-双栈和状态转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。