Leetcode224 基本加减计算器-双栈和状态转换
題目
實現(xiàn)一個基本的計算器來計算一個簡單的字符串表達式的值。
字符串表達式可以包含左括號 ( ,右括號 ),加號 + ,減號 -,非負整數(shù)和空格 。
說明:
你可以假設(shè)所給定的表達式都是有效的。
請不要使用內(nèi)置的庫函數(shù) eval。
來源:力扣(LeetCode)
鏈接:Leetcode224基本計算器
思路:
采用雙棧,一個是數(shù)值棧number_stack;另一個操作符棧operation_stack來進行計算。
整個過程引入三個狀態(tài)進行轉(zhuǎn)換:state_begin,number_state,operation_state,轉(zhuǎn)換關(guān)系如下圖。
圖片:來源小象學(xué)院B站視頻
代碼
#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();//該運算符出棧}//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;//進行壓棧操作使用int state=state_begin;//初始狀態(tài)int compute_flag=0;//可以進行運算的標(biāo)記,=1表示可進行運算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--重新進入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é)果
這是表達式s="1+121-(14+(5-6))"的值。
總結(jié)
本題在leetcode中標(biāo)記為hard難度,這里采用的是有限狀態(tài)轉(zhuǎn)換法。
每個狀態(tài)作何處理,這個需要想清楚。
同時需要注意的是指針的退格,這里的 循環(huán)遍歷 i 起到指針的作用。
比如,第i個字符進入操作符狀態(tài)(operation_state),如果它是數(shù),不是±符號,我們需要將其狀態(tài)轉(zhuǎn)變(number_state),然后讓該位置i重新進入到switch中,這里就需要指針的退格(i- -) 。
進行棧內(nèi)運算時,需要設(shè)置標(biāo)記位,遇到右括號可以進行計算。
參考資料
B站leetcode刷題視頻av29912609
總結(jié)
以上是生活随笔為你收集整理的Leetcode224 基本加减计算器-双栈和状态转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旺街店名好听吗?
- 下一篇: 40个面筋一包20块多少钱一串啊?