九度OJ-題目1019:簡單計算器
- 題目描述:
- 讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
- 輸入:
- 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
- 輸出:
- 對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
- 樣例輸入:
-
1 + 2 4 + 2 * 5 - 7 / 11 0
- 樣例輸出:
-
3.00 13.36
分析:
題目難度:中等
解決方案:符號棧
難點:符號級別
c++程式碼如下:
#include <iostream> #include <stdio.h> #include <stack> #include <string.h> using namespace std; #define MAX_LEN 501 stack<double> num_stack; stack<char> sign_stack; char cs[MAX_LEN] ; int num_arr[MAX_LEN]; int n; int sign_arr[MAX_LEN]; int m; //判斷符號 int isOp(char c){ return c=='+'||c=='-'||c=='*'||c=='/'; } //比較符號級別 int cmp(char o1,char o2){ if((o1=='/'||o1=='*')&&(o2=='+'||o2=='-'))return 1; return -1 ; } //單步運算 double op(char o,double a,double b){ double res = 0.0; if(o=='+')res = a+b; else if(o=='-')res = a - b; else if(o=='*')res = a * b; else res = a/b; return res ; } //主要函式計算表示式的結果 double getRes(){ int i=n-1,j=m-1; char t1,t2; double a,b,res ; num_stack.push(num_arr[i--]); sign_stack.push(sign_arr[j--]); while(!sign_stack.empty()){ if(i==-1&&j==-1){ t1 = sign_stack.top(); sign_stack.pop(); a = num_stack.top();num_stack.pop(); b = num_stack.top();num_stack.pop(); res = op(t1,a,b); num_stack.push(res); } if(i>=0){ num_stack.push(num_arr[i--]); } if(j>=0){ //關鍵!!! while(sign_stack.size()>0){ t1 = sign_stack.top(); t2 = sign_arr[j]; if(cmp(t1,t2)>0){ sign_stack.pop(); a =num_stack.top();num_stack.pop(); b =num_stack.top();num_stack.pop(); res = op(t1,a,b); num_stack.push(res); }else break; } sign_stack.push(sign_arr[j--]); } } res = num_stack.top() ;num_stack.pop(); return res ; } //表示式轉化為兩個陣列 void cs2arr(){ int len = strlen(cs); int i ; int t = 0 ; n=0; m=0; for(i=0;1;i++){ if(isOp(cs[i])||cs[i]=='\0'){ if(isOp(cs[i]))sign_arr[m++] = cs[i]; num_arr[n++] = t; if(cs[i]=='\0')break; t = 0 ; } else if(cs[i]==' ')continue ; else { t*=10; t+=cs[i]-'0'; } } } int main() { while(1){ gets(cs); if(strcmp(cs,"0")==0)break; cs2arr(); printf("%.2lf\n",getRes()); } return 0; }
相關推薦
九度OJ-題目1019:簡單計算器
題目描述: 讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。 輸入: 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果
九度OJ 題目1019:簡單計算器
題目描述: 讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。 輸入: 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要
九度OJ 題目1204:農夫、羊、菜和狼的故事
pla pan wol 題目 r+ ear play struct tab 思路:廣度 優先 記錄路徑長度 但是題目的意思好像是要記錄具體路徑 下次再搞吧 題目描述: 有一個農夫帶一只羊、一筐菜和一只狼過河.果沒有農夫看管,則狼要吃羊,羊要吃菜.但是船很小,只
九度OJ-題目1009:二叉搜索樹
提交 二叉排序樹 軟件 amp cpp creat .com xheditor ear 題目1009:二叉搜索樹 從如今開始打算重新啟動刷題征程。程序猿的人生不須要解釋! 這次撇開poj hoj等難度較大的oj系統,從九度入手(已經非常長時間沒寫過代碼
九度OJ-題目1009:二叉搜尋樹
題目1009:二叉搜尋樹 從現在開始打算重啟刷題征程。程式設計師的人生不需要解釋! 這次撇開poj hoj等難度較大的oj系統,從九度入手(已經很長時間沒寫過程式碼了),主要先“叫醒” 沉睡依舊的大腦。唉~真的很長時間沒寫部落格,沒寫程式碼了,只能加油吧!
九度OJ—題目1089:數字反轉
題目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,現在又任意兩個正整數,問他們兩個數反轉的和是否等於兩個數的和的反轉。 輸入: 第一行一個正整數表示測試資料的個數n。 只有n行,每行兩個正整數a和b(0<a,b<=10000)。 輸出
九度OJ 題目1014:排名
題目描述: 今天的上機考試雖然有實時的Ranklist,但上面的排名只是根據完成的題數排序,沒有考慮每題的分值,所以並不是最後的排名。給定錄取分數線,請你寫程式找出最後通過分數線的考生,並將他們的成績按降序列印。 輸入: 測試輸入包含若干場考試的資訊。每場
九度OJ題目1201:二叉排序樹
紀念一下終於在二叉樹上的程式碼準確率,但還是在給root分配空間的時候忘記要寫了 悲劇 還沒看到提示要考慮忽略重複元素,這個好解決 題目描述: 輸入一系列整數,建立二叉排序數,並進行前
九度 oj 題目1208:10進位制 VS 2進位制
參考了 根據參考1有 #include <cstdio> #include <cstring> #define MAXN 4000 int main(){ int to[MAXN]; int from[MAXN];
九度OJ-題目1521:二叉樹的映象
題目連結地址: 題目描述: 輸入一個二叉樹,輸出其映象。 輸入: 輸入可能包含多個測試樣例,輸入以EOF結束。 對於每個測試案例,輸入的第一行為一個整數n(0<=n<=1000,n代表將要輸入的二叉樹節點的個數(節點從1開始編號)。接下來一行有n個數字,
九度OJ-題目1214:醜數
題目連結地址: 題目描述:把只包含因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。 輸入:輸入包括一個整數N(1<=N<=1500)。 輸
九度OJ題目1047:素數判定
時間限制:1 秒 記憶體限制:32 兆 特殊判題:否 題目描述: 給定一個數n,要求判斷其是否為素數(0,1,負數都是非素數)。 輸入: 測試資料有多組,每組輸入一個數n。 輸出: 對於每組輸入,若是素數則輸出yes,否則輸入no。 樣例輸入: 13 樣例輸出: yes #include
九度 oj 題目1008:最短路徑問題
這道題告訴我們 INT_MAX, 慎用,dijkstra 有時加溢位了,你都不知道 #include <cstdio> //#include <climits> #include <algorithm> using namespace
九度 OJ 題目1008:最短路徑問題 (Dijstra 演算法)
題目描述: 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。 輸入: 輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為
九度OJ 題目1126:列印極值點下標
一.題目描述: 在一個整數陣列上,對於下標為i的整數,如果它大於所有它相鄰的整數, 或者小於所有它相鄰的整數,則稱為該整數為一個極值點,極值點的下標就是i。 輸入: 每個案例的輸入如下: 有2×n+1行輸入:第一行是要處理的陣列的個數n; 對其餘2×n行,第一
九度OJ-題目1163:素數
題目描述: 輸入一個整數n(2<=n<=10000),要求輸出所有從1到這個整數之間(不包括1和這個整數)個位為1的素數,如果沒有則輸出-1。 輸入: 輸入有多組資料。 每組一行,輸入n。 輸出: 輸出所有從1到這個整數之間(不包
九度OJ—題目1067:n的階乘
題目描述: 輸入一個整數n,輸出n的階乘 輸入: 一個整數n(1<=n<=20) 輸出: n的階乘 樣例輸入: 3 樣例輸出: 6 #include <stdio.h> #include <string.h> #include <stdlib.h>
九度OJ-題目1509:樹中兩個結點的最低公共祖先
題目連結地址: 題目描述:給定一棵樹,同時給出樹中的兩個結點,求它們的最低公共祖先。 輸入:輸入可能包含多個測試樣例。對於每個測試案例,輸入的第一行為一個數n(0<n<1000),代表測試樣例的個數。其中每個測試樣例包括兩行,第一行為一個二叉樹的先序遍歷序列
九度OJ 題目1003:A+B
一.題目描述: 給定兩個整數A和B,其表示形式是:從個位開始,每三位數用逗號","隔開。 現在請計算A+B的結果,並以正常形式輸出。 輸入: 輸入包含多組資料資料,每組資料佔一行,由兩個整數A和B組成(-10^9 < A,B < 10^9)。 輸出: 請
九度OJ題目1081:遞推數列解題報告
題目分析1:一個很顯然的想法是遞推計算這k+1個數對10000的模,實現如下:原始碼1(TLE)#include <stdio.h>#include <stdlib.h>#define MOD 10000int main() { int a0, a1, p, q, k;