藍橋杯 演算法訓練 表示式計算
阿新 • • 發佈:2019-02-19
演算法訓練 表示式計算
時間限制:1.0s 記憶體限制:256.0MB
提交此題
問題描述
輸入一個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。
輸入格式
輸入一行,包含一個表示式。
輸出格式
輸出這個表示式的值。
樣例輸入
1-2+3*(4-5)
樣例輸出
-4
資料規模和約定
表示式長度不超過100,表示式運算合法且運算過程都在int內進行。
#include<bits/stdc++.h>
using namespace std;
stack<string> s1;//最後儲存逆波蘭順序棧
stack<string > s2;//先存的是逆波蘭倒序棧
stack<int > s3;//數字棧
map<string ,int > d;
string s;
void runin(string c)
{
//cout<<c<<endl;
if(d[c]>d[s1.top()]) s1.push(c);
else if(c=="(") s1.push("!");
else if(c==")")
{
while(s1.top()!="!")
{
s2.push(s1.top());
s1.pop();
}
s1.pop();
}
else
{
s2.push(s1.top());
s1.pop();
s1.push(c);
}
//cout<<s1.size()<<endl;
}
int main()
{
d["#"] = 0;
d["+"] = 1;
d["-"] = 1;
d["*"] = 2;
d["/"] = 2;
while(cin>>s)
{
s1.push("#");
string de;
for(int i=0;s[i];)
{
//cout<<s[i]<<' ';
if(s[i]>='0'&&s[i]<='9')
{
while(s[i]>='0'&&s[i]<='9')
de+=s[i++];
s2.push(de);
de.clear();
}
if(!(s[i]>='0'&&s[i]<='9'))
{
string tt;
tt+=s[i];
//cout<<tt<<endl;
runin(tt);
tt.clear();
}
i++;
}
while(s1.size()&&s1.top()!="#")
{
//cout<<s1.top()<<endl;
s2.push(s1.top());
s1.pop();
}
s1.pop();
while(s2.size())
{
//cout<<s2.top()<<' ';//逆波蘭式
s1.push(s2.top());
s2.pop();
}
while(s1.size())
{
if(d[s1.top()])
{
int l=s3.top();s3.pop();
int r=s3.top();s3.pop();
// cout<<l<<' '<<r<<' '<<s1.top()<<endl;
if(s1.top()=="+") s3.push(l+r);
if(s1.top()=="-") s3.push(r-l);
if(s1.top()=="*") s3.push(l*r);
if(s1.top()=="/") s3.push(r/l);
}
else
{
de=s1.top();
int xx=0;
for(int i=0;de[i];i++)
{
xx=xx*10+de[i]-'0';
}
s3.push(xx);
}
s1.pop();
}
//cout<<endl;
cout<<s3.top()<<endl;
}
}