日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【NYOJ-35】表达式求值——简单栈练习

發布時間:2025/3/14 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NYOJ-35】表达式求值——简单栈练习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

表達式求值

時間限制:3000?ms ?|? 內存限制:65535?KB 難度:3 描述

Dr.Kong設計的機器人卡多掌握了加減法運算以后,最近又學會了一些簡單的函數求值,比如,它知道函數min(20,23)的值是20?,add(10,98)?的值是108等等。經過訓練,Dr.Kong設計的機器人卡多甚至會計算一種嵌套的更復雜的表達式。

假設表達式可以簡單定義為:

1.?一個正的十進制數?x?是一個表達式。

2.?如果?x?和?y?是?表達式,則?函數min(x,y?)也是表達式,其值為x,y?中的最小數。

3.?如果?x?和?y?是?表達式,則?函數max(x,y?)也是表達式,其值為x,y?中的最大數。

4.如果?x?和?y?是?表達式,則?函數add(x,y?)也是表達式,其值為x,y?之和。

例如,?表達式?max(add(1,2),7)?的值為?7。

請你編寫程序,對于給定的一組表達式,幫助?Dr.Kong?算出正確答案,以便校對卡多計算的正誤。

輸入
第一行: N 表示要計算的表達式個數 (1≤ N ≤ 10)?
接下來有N行, 每行是一個字符串,表示待求值的表達式
(表達式中不會有多余的空格,每行不超過300個字符,表達式中出現的十進制數都不
超過1000。)
輸出
輸出有N行,每一行對應一個表達式的值。
樣例輸入
3 add(1,2) max(1,999) add(min(1,1000),add(100,99))
樣例輸出
3 999 200
【代碼】   1 #include<iostream> 2 #include<string.h> 3 #include<stdio.h> 4 #include<stdlib.h> 5 #include<stack> 6 using namespace std; 7 8 stack<int> s; 9 10 int min(int p,int q){ 11 // if(p > q) return q; 12 // else return p; 13 return p >= q ? q : p; 14 } 15 16 int max(int p,int q){ 17 // if(p > q) return p; 18 // else return q; 19 return p >= q ? p : q; 20 } 21 22 int add(int p,int q){ 23 return p+q; 24 } 25 26 void reverse(char a[]){ 27 char b[405]; 28 memset(b,0,sizeof(b)); 29 strcpy(b,a); 30 for(int i = 0;i < strlen(a);i++) 31 a[i] = b[strlen(b)-i-1]; 32 } 33 int main(){ 34 int n; 35 char a[305],str[305]; 36 scanf("%d",&n); 37 getchar(); 38 while(n--){ 39 int k = 0,ex = 0; 40 gets(a); 41 memset(str,0,sizeof(str)); 42 if(a[strlen(a)-1] != ')'){ 43 printf("%s\n",a); 44 continue; 45 } 46 for(int i = strlen(a) - 1; i >= 3;i--){ 47 if(a[i] == ')') continue; 48 if(a[i] != ',' && a[i] != '(') str[k++] = a[i]; 49 if(a[i-1] == ',' || a[i-1] == '('){ 50 reverse(str); 51 ex = atof(str); 52 k = 0; 53 memset(str,0,sizeof(str)); 54 s.push(ex); 55 } 56 if(a[i] == '('){ 57 int p,q; //獲得棧中數據 58 p = s.top(); s.pop(); 59 q = s.top(); s.pop(); 60 switch(a[i-1]){ 61 case 'd': s.push(add(p,q)); i-=3; continue; 62 case 'n': s.push(min(p,q)); i-=3; continue; 63 case 'x': s.push(max(p,q)); i-=3; continue; 64 } 65 } 66 } 67 printf("%d\n",s.top()); 68 } 69 return 0; 70 }

?

【總結】

  字符串轉為雙精度數值:

1 //語法: 2 #include <stdlib.h> 3 double atof( const char *str ); 4 //功能:將字符串str轉換成一個雙精度數值并返回結果。參數str必須以有效數字開頭,但是允許以“E”或“e”除外的任意非數字字符結尾。例如: 5 //x = atof( "42.0is_the_answer" ); 6 //x的值為42.0.

  const:

    關鍵字const用來告訴編譯器一個一旦被初始化過的變量就不能再修改

    const?int a=5;?與?int?const?a=5;?等同

    類名?const?對象名?與?const?類名 對象名?等同

  

轉載于:https://www.cnblogs.com/zhengbin/p/4347054.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的【NYOJ-35】表达式求值——简单栈练习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。