第九屆河南省大學生程式設計大賽 A題 表示式求值

2021-10-09 19:49:35 字數 1650 閱讀 3989

問題描述:

假設表示式定義為:

1. 乙個十進位制的正整數 x 是乙個表示式。

2. 如果 x 和 y 是 表示式,則 x+y, x*y 也是表示式; *優先順序高於+.

3. 如果 x 和 y 是 表示式,則 函式 smax(x,y)也是表示式,其值為:先分別求出 x ,y值的各位數字之和,再從中選最大數。

4.如果 x 是 表示式,則 (x)也是表示式。例如:表示式 12*(2+3)+smax(333,220+280) 的值為 69。請你程式設計,對給定的表示式,輸出其值。  

輸入:

【標準輸入】 第一行: t 表示要計算的表示式個數 (1≤ t ≤ 10) 接下來有 t 行, 每行是乙個字串,表示待求的表示式,長度<=1000

輸出:

【標準輸出】 對於每個表示式,輸出一行,表示對應表示式的值。

樣例輸入:

3

12+2*3

12*(2+3)

12*(2+3)+smax(333,220+280)

樣例輸出:

18

6069

思路:

此題主要利用的是資料結構中棧的壓入與彈出,把運算子和資料分別壓入不同的棧中進行相應的操作,在處理smax()時,遍歷到 s 要把 s 壓入到字元棧中,但是在壓入之前,先壓入乙個左括弧 "(",目的是為了當遇到棧頂是 s 時,計算資料棧內的資料,即smax() 表示式中的值。

題解**:

#include#include#includeusing namespace std;

stackdsta;//資料棧

stackosta;//字元棧

char s[1005];

int main()

else if(s[i]>='0' && s[i]<='9')

else if(s[i]=='+')

dsta.push(c);

osta.pop();

}osta.push(s[i]);

}else if(s[i]=='*')

osta.push(s[i]);

}else if(s[i]==')' || s[i]==',')//遇到逗號及時求值

while(a!=0)

c=max(suma,sumb);

break;}}

dsta.push(c);

osta.pop();

}osta.pop();

if(s[i]==',')//求完值之後,把逗號壓入棧內,以便後半部分smax表示式的求值

osta.push(s[i]);

}} printf("%d\n",dsta.top());

dsta.pop();

} return 0;

}

河南省第九屆ACM C題

題目 從第乙個節點到底n個節點傳遞資訊,請選擇一條安全概率最高的。輸入 第一行 t 表示有t組測試資料 1 t 8 對於每組測試資料 第一行 n,m 分別表示節點數和通道數 1 n 10000 1 m 50000 接下來有m行 每行 i,j,p 表示節點i,j間有一條通道,p 表示安全的概率 輸出 ...

第九屆湖南省大學生程式設計競賽部分題解

前言 這套題目到處都找不到,csu上面也提交不了。最後在湖南師大oj找到了,可是這個師大oj實在是不好用,每次提交都要重新登入不說,還不支援lld,還我浪費好多時間去改wa。思路 資料量比較小,直接暴力求解即可。include include include include include incl...

河南省第九屆省賽 通道安全

時間限制 1000 ms 記憶體限制 65535 kb 難度 2描述 alpha 機構有自己的一套網路系統進行資訊傳送。情報員 a 位於節點 1,他準備將乙份情報 傳送給位於節點 n 的情報部門。可是由於最近國際紛爭,戰事不斷,很多通道都有可能被遭到監 視或破壞。經過測試分析,alpha 情報系統獲...