首先粘一下題目:
算術表示式有字首表示法、中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2+3*(7-4)+8/4的字首表示式是:+ + 2 * 3 - 7 4 / 8 4。請設計程式計算字首表示式的結果值。
輸入格式說明:
輸入在一行內給出不超過30個字元的字首表示式,只包含+、-、*、\以及運算數,不同物件(運算數、運算符號)之間以空格分隔。
輸出格式說明:
輸出字首表示式的運算結果,精確到小數點後1位,或錯誤資訊「error」。
樣例輸入與輸出:序號
輸入輸出
1
+ + 2 * 3 - 7 4 / 8 4
13.0
2
/ -25 + * - 2 3 4 / 8 4
12.5
3
/ 5 + * - 2 3 4 / 8 2
error
4
+10.23
10.2
先說一下我的解題思路吧:
1. 首先要處理輸入的資料,這裡用到的資料結構有stackmystack,stackintstack。我使用vector容器讀入並儲存一整行字串。mystack用來存放中間結果,intstack用來存放讀入「數字」字元。dotpos記錄了小數點的位置。
stackmystack;
stackintstack;
int dotpos = 0;
vectorvec;
char c;
while ((c = getchar()) != '\n')
2. 接下來要用到for迴圈,從後向前的處理每乙個字元。
for (int i = vec.size()-1; i >=0; i--)
4. 第二個if語句,用來判斷是不是+ - * /,並且如果要是+ -還要考慮他們是一元運算子(表示正負),還是二元運算子(表示加減)。
if (vec[i] == '+' || vec[i] == '-' || vec[i] == '*' || vec[i] == '/')
itemp *= -1;
if (dotpos == 0)
mystack.push(itemp);
else
continue;
}
4.2 判斷是一元運算子+(表示正),方法和上面幾乎完全相同,只不過是少乘以乙個-1就可以了,**如下:
else if (vec[i] == '+' && intstack.size() != 0)
if (dotpos == 0)
mystack.push(itemp);
else
continue;
}
4.3 接下來就是判斷二元運算子了,因為二元運算子必須要兩個運算元,因此如果mystack棧中的數字少於兩個,那麼肯定就是error了。同樣,如果除法運算的除數是0,那肯定也是error。進行+ - * /之後,不要忘記把結果壓入mystack棧中。這部分比較簡單,**如下:
else if (mystack.size() < 2)
double a = mystack.top();
mystack.pop();
double b = mystack.top();
mystack.pop();
double r = 0;
switch (vec[i])
break;
}mystack.push(r);
continue;
}
5. 第3個if語句,用來判斷是不是空格,即' ',如果是空格的話,之前intstack棧中的數字,要全部彈出,組成乙個新的數字,壓入mystack棧中。方法其實上面已經有了。可以自己嘗試寫一下。**如下:
if (vec[i] == ' ')
if (ilen != 0)
}continue;
}
6. 第4個if語句,用來判斷是不是'0'到'9',如果是的話,壓入intstack棧中。注意壓棧的時候要減掉'0'哦。因為vector[i]可是字元。
if (vec[i] >= '0' && vec[i] <= '9')
7. 輸出結果,就是mystack棧中的那乙個元素了。
8.完整**:
#include #include #include #include#includeusing namespace std;int main()
for (int i = vec.size()-1; i >=0; i--)
if (vec[i] == '+' || vec[i] == '-' || vec[i] == '*' || vec[i] == '/')
itemp *= -1;
if (dotpos == 0)
mystack.push(itemp);
else
continue;
}else if (vec[i] == '+' && intstack.size() != 0)
if (dotpos == 0)
mystack.push(itemp);
else
continue;
}else if (mystack.size() < 2)
double a = mystack.top();
mystack.pop();
double b = mystack.top();
mystack.pop();
double r = 0;
switch (vec[i])
break;
}mystack.push(r);
continue;
} if (vec[i] == ' ')
if (ilen != 0)
}continue;
} if (vec[i] >= '0' && vec[i] <= '9')
}printf("%.1lf", mystack.top());
return 0;
}
求字首表示式的值
算術表示式有字首表示法 中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2 3 7 4 8 4的字首表示式是 2 3 7 4 8 4。請設計程式計算字首表示式的結果值。輸入在一行內給出不超過30個字元的字首表示式,只包含 以及運算數,不同物件 運算數 運算符號 之間以空格...
求字首表示式的值
目錄 求字首表示式的值 問題描述 實現 算術表示式有字首表示法 中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2 3 7 4 8 4的字首表示式是 2 3 7 4 8 4。請設計程式計算字首表示式的結果值。輸入格式 輸入在一行內給出不超過30個字元的字首表示式,只包含 ...
求字首表示式的值
用兩個stack 乙個存字元,乙個存數字 從後往前來算,遇到數字先把數字放到smathl裡 遇到字元 再從smath裡拿出倆個數字,其實smath裡最多就有兩個數字 拿完刪除 再把結果放到smath裡 這樣最後乙個數字的就是結果了 include include include using name...