四則運算運算式計算
題目描述
計算非負整常數四則運算運算式,可用的運算子有:+ - * / ( ) 。
輸入
一組非負整常數四則運算運算式,每個運算式輸入一行,長度不超過1024個字符。
輸出
每個運算式的計算結果輸出一行,錯誤的運算式輸出error。
樣例輸入 Copy
12+5
-4-7
3-*5
((12-3)/2)+5
3+7/(2-2)
樣例輸出 Copy
17
error
error
9
error
我的思路演算法流程:
E1:設立運算子堆疊和運算元堆疊;
E2:開始運算子#入堆疊,向運算式串尾添加結束運算子#;
E3:逐詞讀入運算式,并處理:
E31:若讀入為運算元,則入堆疊;
E32:若讀入為運算子,則與堆疊頂運算子相比較:
E321:若堆疊頂運算子優先級高于讀入運算子:
彈出堆疊頂運算子和兩個運算元,計算并將結果入堆疊,執行步驟E32;
E322:若堆疊頂運算子優先級低于讀入運算子:
則將讀入運算子入堆疊,執行步驟E3;
E323:若堆疊頂運算子優先級等于讀入運算子:
若為#,計算結束,若為括號,則彈出運算子,執行步驟E3。
E4:檢查堆疊狀態,得到計算結果;
下面是我的代碼 主要是一方面我想不到該如何解決優先級的設定問題 是像我這樣用函式值大小標記比較嗎? 又或者應該怎么解決呢?
求前輩幫忙修改&思路。
#include<bits/stdc++.h>
using namespace std;
int flag(char c){
int ret=0;
switch(c){
case '+': ret=1; break;
case '-': ret=1; break;
case '*': ret=2; break;
case '/': ret=2; break;
case '(': ret=3; break;
// case ')': ret=3; break;
default: break;
}
return ret;
}
int main(){
stack<int> s1;
stack<char> s2;
char z='#';
s2.push(z);
string x;
cin>>x;
x+="#";
e3: for(int i=0;i<x.length();i++){
char c=x[i];
if(isdigit(c)){
if(flag(s2.top())>flag(c)){
char y=s2.top(); s2.pop();
int x1=s1.top(); s1.pop();
int x2=s1.top(); s1.pop();
switch(y){
case '+': s1.push(x1+x2); break;
case '-': s1.push(x1-x2); break;
case '*': s1.push(x1*x2); break;
case '/': s1.push(x1/x2); break;
// case '(': ret=3; break;
// case ')': ret=3; break;
default: break;
}
goto e3;
}
else if(flag(s2.top())<flag(c)){
s2.push(c);
continue;
}
else if(flag(s2.top())==flag(c)){
if(c=='#') break;
if(c=='('||c==')'){
s2.pop();
continue;
}
}
}
else{
s1.push(c);
}
}
while(!s1.empty()){
cout<<s1.top();
s1.pop();
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/166927.html
標籤:C++ 語言
上一篇:std::thread
