1. 程式人生 > >九度OJ-題目1019:簡單計算器

九度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 題目120810進位制 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題目1067n的階乘

題目描述: 輸入一個整數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 題目1003A+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;