求字首表示式的值

2021-06-27 21:19:49 字數 3334 閱讀 7193

首先粘一下題目:

算術表示式有字首表示法、中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如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...