程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> NYOJ128 前綴式計算(棧的運用)

NYOJ128 前綴式計算(棧的運用)

編輯:關於C++

 

+ 2 * + 3 4 5的值就是 37,詳見輸入輸出。

輸入有多組測試數據,每組測試數據占一行,任意兩個操作符之間,任意兩個操作數之間,操作數與操作符之間都有一個空格。輸入的兩個操作數可能是小數,數據保證輸入的數都是正數,並且都小於10,操作數數目不超過500。
以EOF為輸入結束的標志。輸出對每組數據,輸出該前綴表達式的值。輸出結果保留兩位小數。樣例輸入
+ 2 * + 3 4 5
+ 5.1 / 3 7
樣例輸出
37.00
5.53

題目分析:

用兩個棧進行存下數字和操作,進行計算,我剛開始想的是,每當連續輸入兩個數就行進行計算,並將結果壓入數字棧中,並且操作時,應該保證後出棧的數字在前,先出棧的在後,這樣可以保證-、/的結果。。。。。哎,不知道為什麼一直Wa,最後看看別人打代碼,這題可以從後往前計算,遇到操作符進行計算即可。此題需要注意就是字符串到數字的轉換。

 

AC代碼:

 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
char str[1005];
stack dt;
int start;

void vol(){
    int i=0,k=0;
    char a[15],b[15];
    for(;str[start]!=' ';start--){
        a[k++]=str[start];
    }
    start--;//去掉數字後面的空格
    a[k]='';
    //strrev();此函數不能用
    for(i=0;i

我的代碼:

 

 

int main()
{
    string str;
    int i,k;
    double a,b;
    while(getline(cin,str)){
        stack dt;
        stack ct;
        i=-1; k=0;
        while(i!=str.size()){
            ++i;
            if(str[i] == ' ') ++i;
            if(str[i] >= '0' && str[i] <= '9'){
                string res; double temp;
                while(i != str.size() && str[i] != ' ')
                    res += str[i++];
                sscanf(res.c_str(), %lf, &temp);
                //cout<1){
                a=dt.top();
                dt.pop();
                b=dt.top();
                dt.pop();
                char c=ct.top();
                ct.pop();
                if(c=='+') dt.push(b+a);
                if(c=='-') dt.push(b-a);
                if(c=='*') dt.push(b*a);
                if(c=='/') dt.push(b/a);
                k=1;
            }
        }
        while(dt.size()>1&&ct.size()){//計算最後一個
            a=dt.top();
            dt.pop();
            b=dt.top();
            dt.pop();
            char c=ct.top();
            ct.pop();
            if(c=='+') dt.push(b+a);
            if(c=='-') dt.push(b-a);
            if(c=='*') dt.push(b*a);
            if(c=='/') dt.push(b/a);
        }
        int k=1;
        if(ct.size()&&ct.top()=='-') k=-1;
        printf(%.2lf
,k*dt.top());
    }
	return 0;
}


 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved