時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:4 描述
聰明的你幫助
c小加解決了中綴表示式到字尾表示式的轉換(詳情請參考「鬱悶的c小加(一)」),
c小加很高興。但
c小加是個愛思考的人,他又想通過這種方法計算乙個表示式的值。即先把表示式轉換為字首和字尾表示式,再求值。這時又要考慮運算元是小數和多位數的情況。
輸入
第一行輸入乙個整數t,共有t組測試資料(t<10)。
每組測試資料只有一行,是乙個長度不超過1000的字串,表示這個表示式,每個表示式都是以「=」結束。這個表示式裡只包含+-*/與小括號這幾種符號。其中小括號可以巢狀使用。資料保證輸入的運算元中不會出現負數並且小於1000000。
資料保證除數不會為0。
輸出對於每組測試資料輸出結果包括三行,先輸出轉換後的字首和字尾表示式,再輸出計算結果,結果保留兩位小數。
樣例輸入
21+2=
(19+21)*3-4/5=
樣例輸出
+ 1 2 =1 2 + =
3.00
- * + 19 21 3 / 4 5 =
19 21 + 3 * 4 5 / - =
119.20
中綴轉字首:
從後往前
得到乙個操作符或者運算元。
如果是運算元就輸入到陣列,
如果是')'壓棧,
如果是'(' 棧頂出棧直到棧頂為')',然後將')'也彈出
如果是運算子,優先順序大於等於棧頂元素,壓棧
優先順序小於棧頂元素,反覆出棧,並將出棧的元素輸入到陣列,直到優先順序大於等於棧頂元素,並將此運算子壓棧
輸入結束,就將棧裡的元素全部出棧輸入到陣列,直到棧空。
中綴轉字尾:
從前往後
得到乙個操作符或者運算元。
如果是運算元就輸入到陣列,
如果是'('壓棧,
如果是')' 棧頂出棧直到棧頂為'(',然後將'('也彈出
如果是運算子,優先順序大於棧頂元素,壓棧
優先順序小於等於棧頂元素,反覆出棧,並將出棧的元素輸入到陣列,直到優先順序大於棧頂元素,並將此運算子壓棧
輸入結束,就將棧裡的元素全部出棧輸入到陣列,直到棧空。
#include #include #include #include #include using namespace std;
char a[1010], b[1010], c[1010];//b字尾,c字首
int k = 0;
stacks;
stacknum;
int first(char ch)
}void change1()
}else if(a[i] == ')')
else if(a[i] == '(')
s.pop();
i --;
} else
s.push(a[i]);
i --;
} }t = s.top();
while(t != '#')
c[k ++] = '\0';
} void change2()
b[k ++] = ' ';
} else if(a[i] == '(')
else if(a[i] == ')')
s.pop();
i++;
} else
s.push(a[i]);
i++;
} }char t = s.top();
while(t != '#')
b[k ++] = '=';
b[k ++] = '\0';
}void g(char x)
}void count()
else
f = 1;
i++;
}if(f != 0)
temp = temp / pow(10, f - 1);
//printf("%lf\n", temp);
num.push(temp);
temp = 0;
} else if(b[i] == ' ')
else
}}int main (void)
printf("\n");
printf("%s\n", b);
printf("%.2lf\n", num.top());
num.pop();
k = 0;
} return 0;
}
南陽 oj 鬱悶的c小加(三) 題目409
表示式樹思路 a b c d e 對該樹進行後序遍歷得到字尾表示式 ab cde 這裡實現的是如何根據乙個字尾表示式,構造出其相應的表示式樹。演算法思想 其實很簡單,主要就是棧的使用。演算法時間複雜度是o n n是字尾表示式長度。從前向後依次掃瞄字尾表示式,如果是運算元就建立乙個單節點樹,並把其指標...
nyoj 257鬱悶的c小加(一)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 我們熟悉的表示式如a b a b c d 等都屬於中綴表示式。中綴表示式就是 對於雙目運算子來說 操作符在兩個運算元中間 num1 operand num2。同理,字尾表示式就是操作符在兩個運算元之後 num1 num2 ope...
NYOJ 257 鬱悶的C小加(一)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 我們熟悉的表示式如a b a b c d 等都屬於中綴表示式。中綴表示式就是 對於雙目運算子來說 操作符在兩個運算元中間 num1 operand num2。同理,字尾表示式就是操作符在兩個運算元之後 num1 num2 ope...