棧 表示式求值 NOIP2013 P2

2022-08-12 16:48:13 字數 3029 閱讀 9508

【noip2013普及組p2】表示式求值

time limit:10000ms  memory limit:128000k

total submit:37 accepted:19

case time limit:1000ms

description

給定乙個只包含加法和乘法的算術表示式,請你程式設計計算表示式的值。

input

輸入僅有一行,為需要你計算的表示式,表示式中只包含數字、加法運算子「+」和乘法運算子「*」,且沒有括號.

所有參與運算的數字均為0到2^31-1之間的整數。輸入資料保證這一行只有0~9、+、*這12種字元。

output

輸出只有一行,包含乙個整數,表示這個表示式的值。注意:當答案長度多於4位時,請只輸出最後4位,前導0不輸出。

sample input

【樣例1】

1+1*3+4

【樣例2】

1+1234567890*1

【樣例3】

1+1000000003*1

sample output

【樣例1】

8【樣例2】

7891

【樣例3】

4

hint【樣例說明】

樣例1計算的結果為8,直接輸出8。

樣例2計算的結果為1234567891,輸出後4位,即7891。

樣例3計算的結果為1000000004,輸出後4位,即4。

【資料範圍】

對於30%的資料,0≤表示式中加法運算子和乘法運算子的總數≤100;

對於80%的資料,0≤表示式中加法運算子和乘法運算子的總數≤1000;

對於100%的資料,0≤表示式中加法運算子和乘法運算子的總數≤100000。

source

中綴表示式求值——用兩個棧 sign 和 num 分別儲存符號和數字。

當讀入的字元是數字的時候:

用 tt 表示當前讀到的單個數字,則 number = number * 10 + tt

當讀入的字元是符號的時候:

1.此時可以保證之前讀入的乙個完整數字 number 已經可以放入 num 棧當中了, 即 num[++topn] =number ;並將 number 賦值為 0 ,便於下次正確讀入乙個完整數字;

2.

a.)如果當前讀到的運算子優先順序低於或等於前乙個(即 sign 棧頂)運算子優先順序,則前面讀到的兩個數(num[topn - 1] 和 num[topn])可以進行運算,並把運算後的結果直接替代到 num[topn - 1] ——舉個例子,對於這個式子 3 * 2 + 1 ,當讀入到加號的時候便可以把式子從 3 * 2 + 變化為 6 + 了;

b.)如果當前讀入的運算子優先順序大於之前讀入的運算子,則正常壓入符號棧 sign 當中;

請注意,當我們這樣完整地一邊讀入一邊處理完乙個式子之後,此時的簡化後的式子一定滿足:

前面的運算子優先順序小於等於後面

(即運算子公升序排列)

——這是因為如果讀入時乙個式子優先順序大於等於後面的運算子,則已經被提前計算並化簡成乙個數字,比如

3 * 2 + 1 ,在讀入加號時便把 3 * 2 化為 6 了。

既然此時的式子滿足這樣乙個順序(運算子公升序排列),我們只要從後往前把式子算一遍就可以得出表示式的值了。

寫到這裡,程式框架已經很清晰了;當然,針對於題目而言自然有一些相應的細節。比如,這道題當中只要求輸出最後 4 位,所以運算過程當中是可以隨時取模 10000(=10^4) 的(實際上也需要這麼做,因為儘管每個數不會超過 2^31

- 1 ,但它們的積或和就不一定了,是很有可能爆 long long int 的)。

附上乙份**。

1 #include 2

long

long

int num[100005];3

char sign[100005], temp[4];4

int lv[100005], signlv[260];5

inttopn, tops;

6long

long

intnumber;78

long

long

int f(chars)9

18return -1;19

}2021void

init()

2228

29void

solve()

3046

default

: 50}51

}52 num[++topn]=number;

53while

(tops)

54 num[--topn] = f(sign[tops--]);

55return;56

}5758void

output()

5970

if (temp[3] ||flag)

74if (temp[2] ||flag)

78if (temp[1] ||flag)

82if (temp[0] ||flag)

83 putchar(temp[0] + '0'

);84 putchar('\n'

);85

return;86

}8788int

main()

89

ghcred's code

NOIP2013 表示式求值

題目 分析 棧的應用。兩個棧,乙個存數字乙個存操作符,當遇到符號時計算優先順序比它小的所有符號,則最後棧頂元素即為答案。include include include include using namespace std const int tmax 105,mod 10000 stack snu...

p1150 noip2013普及 表示式求值

描述 description 給定乙個只包含加法和乘法的算術表示式,請你程式設計計算表示式的值。輸入格式 input format 輸入僅有一行,為需要你計算的表示式,表示式中只包含數字 加法運算子 和乘法運算子 且沒有括號,所有參與運算的數字均為0到2 31 1之間的整數。輸入資料保證這一行只有0...

表示式求值(棧)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 acm隊的mdd想做乙個計算器,但是,他要做的不僅僅是一計算乙個a b的計算器,他想實現隨便輸入乙個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。比如輸入 1 2 4 程式就輸出1.50 結果保留兩位小數 輸入...