列隊-小型計算機

來源:互聯網
上載者:User

題意:對簡單的‘+’,‘-’,‘*’,‘/';進行運算,運算的結果保證在長整型範圍內。對除以0的輸出"impossible".輸入的運算操作均合法。

輸入的字串長度小於50,數值沒有小數出現。

本題的意圖很明顯,就是依靠列隊來或堆棧來實現。規定了一些條件,從而大大地降低了難度。

分析也很容易。比如算:2+3*5-2;對於合法的運算操作,我們可以知道,運算元比操作符多一個,並且是相互交替,奇偶相間。而運算優先順序‘*’和‘/‘高一些。在入列的時候

我就直接算出來。也可以全部加進去,在以後出來,方法就是:在遇到’*‘或’/'是要彈出兩個運算元(前後)加減不需要。但這樣就麻煩些。所有選擇在入列的時候就計算出來。從而把乘除都排除了。出來時,可以先進先出(隊列),也可以先進後出(堆棧),這源於它們的優先順序相同。

代碼如下:

#include<cstdio>#include<queue>#include<cstring>using namespace std;typedef long long LL;queue<LL>Q;queue<char>S;bool check(char ch){if(ch>='0'&&ch<='9')  return true; return false;}int main(){   char st[55];while(scanf("%s",st)!=EOF){int flag=1;while(!Q.empty())              //清除列隊 Q.pop();while(!S.empty())  S.pop();LL a=0,b=0;int k=strlen(st),i=0;if(check(st[i])){while(i<k&&check(st[i]))    //取出第一數。{a=a*10+st[i]-'0';i++;}}while(i<k){ char ch=st[i++]; b=0; while(i<k&&check(st[i]))    //取出第二個數。 { b=b*10+st[i]-'0';i++; } if(ch=='+'||ch=='-')   //中間運算元。加減直接入列。 {Q.push(a);S.push(ch);a=b; } else if(ch=='/'){      //乘除,先計算,後入列。if(b==0){flag=0;break;}      a/=b;  }    else  a*=b;       }Q.push(a);      //由於,每次取兩個運算元且只取一個操作符,而只入列一個數,所以最後一個數還沒入列。if(flag){a=Q.front();Q.pop();while(!Q.empty()){   if(S.front()=='+')a+=Q.front();else    a-=Q.front();Q.pop();S.pop();}printf("%lld\n",a);} else printf("impossible\n");}return 0;}      

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.