7-6 表示式轉換(25 分)
算術表示式有字首表示法、中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。
輸入格式:
輸入在一行中給出不含空格的中綴表示式,可包含+、-、*、\以及左右括號(),表示式不超過20個字元。
輸出格式:
在一行中輸出轉換後的字尾表示式,要求不同物件(運算數、運算符號)之間以空格分隔,但結尾不得有多餘空格。
輸入樣例:
2+3*(7-4)+8/4
輸出樣例:
2 3 7 4 - * + 8 4 / +
思路
中綴轉字尾 的原則
1.遇到運算元,直接輸出;
2.棧為空時,遇到運算子,入棧;
3.遇到左括號,將其入棧;
4.遇到右括號,執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出;
5.遇到其他運算子』+」-」*」/』時,彈出所有優先順序大於或等於該運算子的棧頂元素,然後將該運算子入棧;
6.最終將棧中的元素依次出棧,輸出。
經過上面的步驟,得到的輸出既是轉換得到的字尾表示式。
舉例:a+b*c+(d*e+f)g ———> abc+de*f+g*+
然後 有幾個 坑點
0.運算元 不一定是一位的 比如 23+2 應該是 23 2 +
1.運算元可能是浮點數 比如 2.3+2 應該是 2.3 2 +
2.可能是負數 比如 -2+3 應該是 -2 3 +
比如 3+(-2) 應該是 3 -2 +
3.正數可能帶有正號 比如 +3+2 應該是 3 2 +
比如 3+(+2) 應該是 3 2 +
然後處理下空格就可以了
ac**
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define clr(a) memset(a, 0, sizeof(a))
using
namespace
std;
typedef
long
long ll;
typedef
long
double ld;
typedef
unsigned
long
long ull;
typedef pair pii;
typedef pair pll;
typedef pair psi;
typedef pair pss;
const
double pi = 3.14159265358979323846264338327;
const
double e = exp(1);
const
double eps = 1e-6;
const
int inf = 0x3f3f3f3f;
const
int maxn = 1e3 + 5;
const
int mod = 1e9 + 7;
bool
isdigit(char c)
int main()
q.push(s[i]);}}
else
if (s[i] == '+')
q.push(s[i]);}}
else
if (s[i] == '-')
else
if (q.empty())
q.push(s[i]);
else
q.push(s[i]);}}
else
if (s[i] == '(')
q.push(s[i]);
else
if (s[i] == ')')
q.pop();}}
}while (!q.empty())
cout
<< ans << endl;
}
表示式轉換 中綴表示式轉換為字尾表示式
算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入格式 輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。輸出格式 在一行中輸出轉換後的字尾表示式,...
表示式轉換
2 3 7 4 8 4 2 3 7 4 8 4 思路 a.若為 入棧 b.若為 則依次把棧中的的運算子加入字尾表示式中,直到出現 從棧中刪除 c.若為 除括號外的其他運算子,當其優先順序高於除 以外的棧頂運算子時,直接入棧。否則從棧頂開始,依次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,...
表示式轉換
7 1 表示式轉換 25 分 算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。在一行中輸出轉換後的字...