1. 程式人生 > >表示式求值運算(逆波蘭式)

表示式求值運算(逆波蘭式)

逆波蘭式:中綴表示式,字尾表示式等內容可百度檢視。

運算表示式  2+3*(1+2)-6/3

開兩個棧,一個存數字,一個存符號。

當 遇到這種情況1:需要先計算後面的內容,再回來計算前面的運算

讓符號進棧暫時儲存。

還有一種情況2:遇到左括號時,只能進棧等待右括號的到來。右括號到來時,運算整個括號內的內容。

其他情況,都可直接計算。

【程式碼】

#include<bits/stdc++.h>
using namespace std;
void cal(stack<int> &S1,stack<char> &S2)//進行一次運算
{
    int b=S1.top();S1.pop();
    int a=S1.top();S1.pop();
    char ch=S2.top();S2.pop();
    int ans;
    if(ch=='+')ans=a+b;
    if(ch=='-')ans=a-b;
    if(ch=='*')ans=a*b;
    if(ch=='/')ans=a/b;
    S1.push(ans);
}
bool compare(char l,char r)//l<r  return 1 入棧
{
    if(l=='('||r=='(')return 1;
    if((l=='+'||l=='-')&&(r=='*'||r=='/'))
        return 1;
    return 0;
}
int main()
{
    cout<<"輸入表示式:\n";
    string s; cin>>s;
    stack<int>S1;
    stack<char>S2;
    for(int i=0;i<s.length();i++)
    {
        int x=0,flag=0;
        while(s[i]>='0'&&s[i]<='9')
            x=x*10+s[i++]-'0',flag=1;
        if(flag) S1.push(x);
        if(i>=s.length())break;
        if(s[i]==')')//遇 ) 則運算整個括號
        {
            while(S2.top()!='(')
                cal(S1,S2);
            S2.pop();
        }
        else
        {
            while((!S2.empty())&&(!compare(S2.top(),s[i])))//計算
                cal(S1,S2);
            S2.push(s[i]);
        }
    }
    while(!S2.empty())//棧中剩餘運算子運算
        cal(S1,S2);
    cout<<S1.top()<<endl;
}