鬱悶的C小加(三) nyoj 409

2021-06-20 23:58:07 字數 2323 閱讀 8710

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:4 描述

聰明的你幫助

c小加解決了中綴表示式到字尾表示式的轉換(詳情請參考「鬱悶的c小加(一)」),

c小加很高興。但

c小加是個愛思考的人,他又想通過這種方法計算乙個表示式的值。即先把表示式轉換為字首和字尾表示式,再求值。這時又要考慮運算元是小數和多位數的情況。

輸入

第一行輸入乙個整數t,共有t組測試資料(t<10)。

每組測試資料只有一行,是乙個長度不超過1000的字串,表示這個表示式,每個表示式都是以「=」結束。這個表示式裡只包含+-*/與小括號這幾種符號。其中小括號可以巢狀使用。資料保證輸入的運算元中不會出現負數並且小於1000000。

資料保證除數不會為0。

輸出對於每組測試資料輸出結果包括三行,先輸出轉換後的字首和字尾表示式,再輸出計算結果,結果保留兩位小數。

樣例輸入

2

1+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...