簡單計算器 (關于棧的一種應用)

題目:簡單計算器
讀入一個只包含 +, -, *, / 的非負整數計算表達式,計算該表達式的值。
Input
測試輸入包含若干測試用例,每個測試用例占一行,每行不超過200個字符,整數和運算符之間用一個空格分隔。沒有非法表達式。當一行中只有0時輸入結束,相應的結果不要輸出。
Output
對每個測試用例輸出1行,即該表達式的值,精確到小數點后2位。

樣例:
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36

思路:利用棧,創建兩個棧,一個是用來存數的,一個用來存運算符的,因為運算符之間是有優先級關系,所以要定義一個函數用來判斷其優先級,當后來即將存的優先級高于棧頂的,則將其存入棧頂,如果后來的優先級是低于棧頂的,則要讓運算符的棧的棧頂與存數的棧的前兩個,進行運算,然后把結果再存入存數的棧頂。依次這樣,最后存數的棧剩下的那個棧頂就是最后的結果;

新技巧:1:這里是棧的一種新的用法,即關于優先級問題的處理,可以通過滿足其優先級關系就進棧,不滿足則進行一系列操作,就是說有關優先級的問題可以考慮用棧來處理;
2:關于優先級的問題,如果無法用數值等來比較,則自己定義函數來將優先級排出來,如果很雜的時候,在情況不多的時候可以一個一個情況列出來;

代碼:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>struct Node {double val;char ch;Node *next;
};struct stacks{Node *top;Node *bottom;
};int compere(char ch1,char ch2);
double sumulete (double a,double b,char x);int main()
{double sum,b1,b2,b3;int tag,i,num;char ch,a[205];while(gets(a)!=NULL){if(strcmp(a,"0")==0)break;stacks *st_number=(stacks *)malloc(sizeof(stacks ));st_number->top=(Node *)malloc(sizeof(Node ));st_number->top->next=nullptr;st_number->bottom=st_number->top;stacks *st_sign=(stacks *)malloc(sizeof(stacks ));st_sign->top=(Node *)malloc(sizeof(Node ));st_sign->top->ch='#';st_sign->top->next=nullptr;st_sign->bottom=st_sign->top;tag=0;sum=0;num=strlen(a);for(i=0;i<=num;i++){if(a[i]==' ')continue;else if(a[i]<='9'&&a[i]>='0'){sum=sum*10+a[i]-'0';tag=1;}else{if(tag){Node *temp=(Node *)malloc(sizeof(Node ));temp->val=sum;temp->next=st_number->top;st_number->top=temp;tag=0;sum=0;}if(compere(st_sign->top->ch,a[i])<0){Node *temp=(Node *)malloc(sizeof(Node ));temp->ch=a[i];temp->next=st_sign->top;st_sign->top=temp;}else if(compere(st_sign->top->ch,a[i])>0){b1=st_number->top->val;Node *tt=st_number->top;st_number->top=tt->next;free(tt);b2=st_number->top->val;b3=sumulete(b1,b2,st_sign->top->ch);st_number->top->val=b3;Node *ss=st_sign->top;st_sign->top=ss->next;free(ss);i--;}else{Node *tt=st_sign->top;st_sign->top=tt->next;free(tt);}}}printf("%.2f\n",st_number->top->val);}return 0;
}double sumulete (double a,double b,char x)
{double t;switch(x){case '*':t=a*b;break;case '/':t=b/a;break;case '+':t=a+b;break;case '-':t=b-a;break;}return t;
}int compere(char ch1,char ch2)
{int tag;if(ch2=='\0'){if(ch1=='#')tag=-1;elsetag=1;}else  if(ch1=='+'||ch1=='-'){if(ch2=='+'||ch2=='-'||ch2==')')tag=1;elsetag=-1;}else  if(ch1=='*'||ch1=='/'){if(ch2=='(')tag=-1;elsetag=1;}else  if(ch1=='('){if(ch2==')')tag=0;elsetag=-1;}else  if(ch1==')')tag=1;else  if(ch1=='#')tag=-1;return tag;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453061.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python中模運算_Python中的模運算

所謂取模運算&#xff0c;就是計算兩個數相除之后的余數&#xff0c;符號是%。如a % b就是計算a除以b的余數。用數學語言來描述&#xff0c;就是如果存在整數n和m&#xff0c;其中0 < m < b&#xff0c;使得$ a n * b m $&#xff0c;那么$ a \% b a - n * b m $。先…

偉大公司為什么需要技術型領導?

Facebook前工程總監黃易山撰寫了一系列文章&#xff0c;很好地總結了Facebook卓越研發文化中的寶貴經驗。本文是這一系列文章的第五篇&#xff0c;也是最后一篇。 何謂技術型領導 所有從外部聘用的管理人員包括技術部門負責人&#xff0c;都必須能夠編寫代碼&#xff0c;并且…

css樣式變 及實際用法

<html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>引入外部樣式</title><link rel" stylesheet" href"home.css&…

服務器部署的參數文檔,服務器參數配置

服務器參數配置 內容精選換一換源端服務器遷移至華為云后&#xff0c;最終將遷移到彈性云服務器上。因此在遷移前&#xff0c;您需要在華為云中創建一個或多個彈性云服務器。進入“彈性云服務器”頁面。關于參數的詳細信息&#xff0c;請參見購買彈性云服務器。Windows系統的目…

擴散法及其改進

擴散法是一種靜態路由算法,每一個輸入的分組都被從除輸入線路之外的所有其它線路上轉發出去.擴散法顯然會產生大量的分組副本,因此必須有一些辦法來抑制無限的轉發.1.一種辦法是在分組頭中攜帶一個跳數計數器,分組每到一個節點其跳數計數器就減1,當計數器為0時分組被丟棄.計數器…

h5頁 點擊返回時關閉_在微信、支付寶、百度錢包實現點擊返回按鈕關閉當前頁面和窗口...

最近在使用微信、支付寶、百度錢包實現網頁支付&#xff0c;對支付成功將自動關閉頁面&#xff0c;對于支付失敗&#xff0c;將顯示錯誤信息。當在錯誤頁面的時候&#xff0c;點擊返回或者Android物理按鍵上一步的時候&#xff0c;將關閉頁面。在微信、支付寶、百度錢包中&…

串操作指令

串操作指令可以方便對一組連續的數據進行操作。串操作后自動根據DF標志位修改ESI和EDI&#xff0c;DF 0時&#xff0c;ESI&#xff0c;EDI遞增&#xff0c;DF 1時&#xff0c;ESI&#xff0c;EDI遞減。串操作指令有2組&#xff0c;1組實現數據串傳送&#xff0c;另1組實現數據…

IS-IS基本配置

實驗內容&#xff1a;現在網絡中有4臺路由器&#xff0c;用戶希望利用這4臺路由器通過IS-IS協議實現網絡互聯&#xff0c;并且因為R1和R2性能相對較低&#xff0c;所以還要使這兩臺路由器處理的數據信息相對較少。 網絡拓撲&#xff1a; 實驗分析&#xff1a; 根據題意可知R1和…

高并發高流量網站架構

Web2.0的興起&#xff0c;掀起了互聯網新一輪的網絡創業大潮。以用戶為導向的新網站建設概念&#xff0c;細分了網站功能和用戶群&#xff0c;不僅成功的造就了一大批新生的網站&#xff0c;也極大的方便了上網的人們。但Web2.0以用戶為導向的理念&#xff0c;使得新生的網站有…

多處理機的進程調度方式

一.自調度方式 二.成組調度方式 三.專用處理機分配方式

枚舉類型用法_Mybatis-plus常見用法總結三

前面已經介紹了Mybatis-plus基本用法&#xff0c;今天為大家分享一些Mybatis-plus高級應用邏輯刪除自動注入枚舉類型處理Sql注入器多租戶表結構CREATE TABLE sys_role ( id varchar(64) NOT NULL COMMENT 主鍵, code varchar(64) NOT NULL DEFAULT COMMENT 角色編碼, name …

NOIP 2011 Day2

tags: 貪心模擬NOIP categories:信息學競賽總結計算系數 Solution 根據二項式定理,\[ \begin{align} (ab)^n\sum_{k0}^nC_{n}^{k}a^kb^{n-k} \end{align} \] 那么\[ \begin{align}(axby)^k&\sum_{p0}^kC_{k}^p(ax)^p(by)^{k-p}\\ &\sum_{p0}^k(C_{k}^pa^pb^{k-p})x^py^…

VS Code的golang開發配置 之 代碼提示

之前用VS Code的時候&#xff0c;發現自己的代碼的提示一直不好&#xff0c;換用JetBrain的Goland的代碼提示是好了&#xff0c;但是比較占用資源。在網上找了一些資料&#xff0c;發現很多人也是遇到第三方或者自己的代碼無法提示的情況&#xff0c;但是都沒有下文了。后來發現…

使用oprofile分析性能瓶頸

使用oprofile分析性能瓶頸 1. 概述oprofile 是 Linux 平臺上&#xff0c;類似 INTEL VTune 的一個功能強大的性能分析工具。其支持兩種采樣(sampling)方式&#xff1a;基于事件的采樣(event based)和基于時間的采樣(time based)。基于事件的采樣是oprofile只記錄特定事件&#…

什么是死鎖

死鎖是多個進程在運行過程中因競爭資源時產生的一種僵局。 各并發資源彼此等待對方擁有的資源&#xff0c;且在得到對方資源前不釋放自己的資源。

python數據工程師 面試題_阿里P7工程師耗時兩天整理的292道python大廠面試題,內含解析!...

前言相對于python大家應該都不會陌生吧&#xff01;現在java跟python可以算的是勢均力敵了&#xff0c;所以現在學習python 的小伙伴也是越來越多了&#xff0c;可是學完之后就能找到稱心如意的工作了嗎&#xff1f;很多小伙伴學習Python的時候感覺很簡單&#xff0c;但是到了去…

數組復制

在Java里面,可以用復制語句”AB”給基本類型的數據傳遞值,但是如果A,B是兩個同類型的數組&#xff0c;復制就相當于將一個數組變量的引用傳遞給另一個數組&#xff1b;如果一個數組發生改變&#xff0c;那么引用同一數組的變量也要發生改變。 1.使用FOR循環,將數組的每個元素復…

IntelliJ IDEA 對于generated source的處理

IntelliJ IDEA 對于generated source的處理 學習了&#xff1a;https://stackoverflow.com/questions/5170620/unable-to-use-intellij-with-a-generated-sources-folder 如果有generated source &#xff0c;例如使用gRPC過程中生成的&#xff0c;可以使用鼠標右鍵點擊使之成為…

產生死鎖的原因

一 競爭資源&#xff0c;但是資源的數目不能滿足進程的需要。 二 進程間推進順序非法&#xff0c;進程在運行過程中請求和釋放資源的順序不當。

fabric shim安裝合約_hyperledger fabric 開發第一個智能合約

一、編寫智能合約代碼HelloWorld.go&#xff0c;go語言實現&#xff0c;代碼很簡單&#xff0c;每個合約包含兩個方法&#xff0c;Init、Invoke。package mainimport ("fmt""github.com/hyperledger/fabric/core/chaincode/shim""github.com/hyperled…