ZJGSU 1199 表達式計算

題目描述

在數據結構課上,老師給大家布置了一個表達式計算的問題 3*2+1*5. It's so easy!!! csw同學做了很不過癮,他想求解更復雜的表達式: 比如(123+456)/789. 但一時之間他想不出好的辦法,諸位就幫幫他吧.

輸入

輸入包括多組數據, 每組測試數據占一行, 包含一個字符串(長度不超過100), 表示要運算的表達式.

輸出

對應每組測試數據, 輸出計算結果(保留三位有效數字) --- 計科1702項方頌更正“保留三位小數,不是三位有效數字”

樣例輸入

(123+456)/789

樣例輸出

0.734

思路:

先將題目給定的中綴表達式轉為后綴表達式,再對后綴表達式進行處理計算,注意題目中有多組輸入

中綴表達式轉后綴表達式規則:

1.遇到數字就直接輸入進后綴表達式中,遇到操作符則先判斷優先級,再輸入到棧中

2.如果棧頂元素優先級大于等于當前操作符,則先將棧頂元素彈出并輸入到后綴表達式中,再將當前操作符壓入棧中

3.如果遇到左括號,則直接將其壓入棧中,如果遇到右括號,則彈出棧中元素,直到遇到左括號為止,并將這些元素輸出到后綴表達式中(也要進行優先級判斷)

4.最后,將棧中剩余元素壓入棧中

后綴表達式計算規則:

1.讀取到數字就直接入棧
2.當讀入運算符就直接將棧中前兩個數彈出,其中先彈出的為右操作數,后彈出的為左操作數,計算之后將結果壓入棧中。
3.直至讀取完畢,棧中剩余的數據的就是結果

其實我感覺我的代碼是有一些問題的,但是oj能過,所以不管了(*^▽^*)

#include<stdio.h>
#include<string.h>
int main()//先轉為后綴表達式,再進行計算
{char ss[200];while(scanf("%s",ss)!=EOF){//多組輸入if(ss[0]=='\n')break;//退出條件char a,st[1001],s[1001];//st為棧,s為后綴表達式memset(st,'\0',sizeof(st));int top=-1,k=0;int flag=0;//用于判斷該數字是否結束,若結束則要在后綴表達式里注入一個空格for(int i=0;i<strlen(ss);i++){a=ss[i];if(flag==1&&(s[k-1]>='0'&&s[k-1]<='9'))//當前數字結束,并且后面一個字符仍然是數字
//此時需要輸入一個空格用于隔開兩個數字{s[k++]=' ';flag=0;}if(a>='0'&&a<='9')//遇到數字直接放入后綴表達式中{s[k++]=a;}else if(a=='+'||a=='-'){if(s[k-1]>='0'&&s[k-1]<='9')//這一步判斷是否需要加空格flag=1;while(st[top]=='+'||st[top]=='-'||st[top]=='*'||st[top]=='/'){//棧頂元素優先級大于等于當前操作符,彈出并輸入到后綴表達式里s[k++]=st[top];top--;flag=0;}st[++top]=a;//當前操作符入棧}else if(a=='*'||a=='/')//和上一塊else if同理{if(s[k-1]>='0'&&s[k-1]<='9')flag=1;while(st[top]=='*'||st[top]=='/'){s[k++]=st[top--];flag=0;}st[++top]=a;}else{if(a=='(')//遇到左括號,左括號入棧{st[++top]=a;}else{//遇到右括號char temp[100];//用于存儲彈出的操作符int t=0;while(st[top]!='(')//彈出棧中,直到遇到左括號(棧頂元素為左括號){temp[t++]=st[top--];}top--;//把左括號出棧for(int i=t-1;i>=0;i--)//優先級高的先入棧{if(temp[i]=='*'||temp[i]=='/')s[k++]=temp[i];}for(int i=t-1;i>=0;i--)//優先級低的后入棧{if(temp[i]=='+'||temp[i]=='-')s[k++]=temp[i];}flag=0;}}}while(top!=-1)//剩余元素入棧{s[k++]=st[top--];}//轉化完成double stt[100];//新棧int ttop=-1;memset(stt,0,sizeof(stt));int temp1=0;double tempp=0;for(int i=0;i<k;i++){if(s[i]<='9'&&s[i]>='0')//讀取數字{temp1=temp1*10+(s[i]-'0');}else if(s[i]==' ')//當前數字結束,壓入棧中{stt[++ttop]=temp1;temp1=0;}else if(s[i]=='+')//將棧中最上面兩個元素相加,并放入棧頂{if(s[i-1]>='0'&&s[i-1]<='9'){//如果當前數字還沒入棧,則先將當前正在讀取的數字入棧stt[++ttop]=temp1;temp1=0;}tempp=stt[ttop]+stt[ttop-1];ttop-=1;stt[ttop]=tempp;}else if(s[i]=='-')//后面三個同理{if(s[i-1]>='0'&&s[i-1]<='9'){stt[++ttop]=temp1;temp1=0;}tempp=stt[ttop-1]-stt[ttop];ttop--;stt[ttop]=tempp;}else if(s[i]=='*'){if(s[i-1]>='0'&&s[i-1]<='9'){stt[++ttop]=temp1;temp1=0;}tempp=stt[ttop-1]*stt[ttop];ttop--;stt[ttop]=tempp;}else if(s[i]=='/'){if(s[i-1]>='0'&&s[i-1]<='9'){stt[++ttop]=temp1;temp1=0;}tempp=stt[ttop-1]/stt[ttop];ttop--;stt[ttop]=tempp;}}printf("%.3lf\n",stt[ttop]);//題目要求保留三位小數,輸出memset(ss,0,sizeof(ss));//初始化一下}
}

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

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

相關文章

實用工具:實時監控服務器CPU負載狀態并郵件通知并啟用開機自啟

作用&#xff1a;在服務器CPU高負載時發送郵件通知 目錄 一、功能代碼 二、配置開機自啟動該監控腳本 1&#xff0c;配置自啟腳本 2&#xff0c;啟動 三、功能測試 一、功能代碼 功能&#xff1a;在CPU負載超過預設置的90%閾值時就發送郵件通知&#xff01;郵件內容顯示…

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之屬性轉換器

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之屬性轉換器 一、聲明式值轉換器二、編程式值轉換器注冊三、MongoCustomConversions配置 雖然基于類型的轉換已經提供了影響目標存儲中某些類型的轉換和表示的方法&#xff0c;但當僅考慮特定類型的某些值或屬性進行轉換…

js中Generator函數詳解

定義&#xff1a; promise是為了解決回調地獄的難題出現的&#xff0c;那么 Generator 就是為了解決異步問題而出現的。 普通函數&#xff0c;如果調用它會立即執行完畢&#xff1b;Generator 函數&#xff0c;它可以暫停&#xff0c;不一定馬上把函數體中的所有代碼執行完畢…

Linux基本指令(下)

目錄 1. less指令 2. head與tail指令 3. find指令 示例 4. grep指令 示例 ?編輯 5. zip/unzip 打包與壓縮 示例 ?編輯 6. tar指令 7. find指令&#xff1a; -name 8. echo指令 9. 時間相關的指令 1.在顯示方面&#xff0c;使用者可以設定欲顯示的格式&#xff…

分布式ID(6):Redis實現分布式ID生成

Redis是一個高性能的鍵值數據庫,它可以用于生成分布式唯一標識符。需要注意的是Redis實現ID可以用,這也是很多公司的選擇。但是在redis服務器宕機的情況下,他也可能會出現重復生成ID的情況。 1 實現原理 利用Redis的原子操作:Redis提供了原子性的INCR和INCRBY命令,可用于…

使用python或AI自動分析數據關聯(簡介)

有一些Python庫可以幫助用戶自動發現數據集中的關聯關系。通常這類方法被稱為關聯分析或關聯規則挖掘&#xff0c;其中最著名的算法是Apriori和FP-Growth。 兩個算法 Apriori算法&#xff1a; 這是一個用于頻繁項集挖掘和關聯規則學習的經典算法。Python中的mlxtend庫提供了一…

【機器學習】有監督學習算法之:K最近鄰

K最近鄰 1、引言2、決策樹2.1 定義2.2 原理2.3 實現方式2.3.1 距離度量2.3.2 K值的選擇 2.4 算法公式2.5 代碼示例 3、總結 1、引言 小屌絲&#xff1a;魚哥&#xff0c; 這么長時間沒更新了&#xff0c;是不是得抓緊時間了。 小魚&#xff1a;最近可都是在忙的呢&#xff0c;…

已解決ResponseEntityException的Spring MVC異常響應實體異常的正確解決方法,親測有效!!!

由于ResponseEntityException并非Spring框架中明確定義的異常類&#xff0c;我推斷這里可能指的是在使用ResponseEntity時遇到的常見異常或錯誤。因此&#xff0c;我將根據這個假設&#xff0c;提供一個解決Spring MVC中與ResponseEntity相關異常的通用方法指南。 目錄 問題分…

線上歷史館藏系統 Java+SpringBoot+Vue+MySQL

??計算機編程指導師 ??個人介紹&#xff1a;自己非常喜歡研究技術問題&#xff01;專業做Java、Python、微信小程序、安卓、大數據、爬蟲、Golang、大屏等實戰項目。 ??實戰項目&#xff1a;有源碼或者技術上的問題歡迎在評論區一起討論交流&#xff01; ?? Java實戰 |…

day09_商品管理訂單管理SpringTaskEcharts

文章目錄 1 商品管理1.1 添加功能1.1.1 需求說明1.1.2 核心概念SPUSKU 1.1.3 加載品牌數據CategoryBrandControllerCategoryBrandServiceCategoryBrandMapperCategoryBrandMapper.xml 1.1.4 加載商品單元數據ProductUnitProductUnitControllerProductUnitServiceProductUnitMap…

詳解java中的Lambda表達式

Lambda表達式的前世今生&#xff08;來歷與概述&#xff09; Lambda表達式的前世------匿名類 以往&#xff0c;使用單一抽象方法的接口被用作函數類型。 它們的實例表示函數&#xff08;functions&#xff09;或行動&#xff08;actions&#xff09;。 自從 JDK 1.1 于 1997…

【MySQL】超詳細-基礎操作

數據庫定義 數據庫是一類軟件&#xff0c;用來管理數據&#xff0c;組織數據&#xff1b; 關系型數據庫MySQL&#xff08;Oracle,SQL Server,SQLite&#xff09;以表格形式組織數據&#xff0c;數據格式要求嚴格&#xff1b;非關系型數據庫Redis&#xff08;MongoDB,HBase&…

數據結構與算法-冒泡排序

引言 在數據結構與算法的世界里&#xff0c;冒泡排序作為基礎排序算法之一&#xff0c;以其直觀易懂的原理和實現方式&#xff0c;為理解更復雜的數據處理邏輯提供了堅實的入門階梯。盡管在實際應用中由于其效率問題不常被用于大規模數據的排序任務&#xff0c;但它對于每一位初…

【C++】set、multiset與map、multimap的使用

目錄 一、關聯式容器二、鍵值對三、樹形結構的關聯式容器3.1 set3.1.1 模板參數列表3.1.2 構造3.1.3 迭代器3.1.4 容量3.1.5 修改操作 3.2 multiset3.3 map3.3.1 模板參數列表3.3.2 構造3.3.3 迭代器3.3.4 容量3.3.5 修改操作3.3.6 operator[] 3.4 multimap 一、關聯式容器 談…

Hololens 2應用開發系列(1)——使用MRTK在Unity中設置混合現實場景并進行程序模擬

Hololens 2應用開發系列&#xff08;1&#xff09;——使用MRTK在Unity中進行程序模擬 一、前言二、創建和設置MR場景三、MRTK輸入模擬的開啟 一、前言 在前面的文章中&#xff0c;我介紹了Hololens 2開發環境搭建和項目生成部署等相關內容&#xff0c;使我們能生成一個簡單Ho…

Redis 之九:Spring Data Redis -- Redis Template 用法

SpringData Redis Spring Data Redis 是 Spring Data 項目的一部分&#xff0c;它為 Java 應用程序提供了一種便捷的方式來與 Redis 數據庫進行交互。 Spring Data Redis 提供了對 Redis 的抽象封裝&#xff0c;使得開發者能夠以面向對象的方式操作 Redis&#xff0c;并簡化了 …

matlab 寫入格式化文本文件

目錄 一、save函數 二、fprintf函數 matlab 寫入文本文件可以使用save和fprintf函數 save輸出結果: fprintf輸出結果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf輸出結果更加人性化,符合要求,下面分別介紹。 一、save函數 …

linux系統Jenkins工具介紹

Jenkins概念介紹 Jenkins概念Jenkins目的特性產品發布流程 Jenkins概念 Jenkins是一個功能強大的應用程序&#xff0c;允許持續集成和持續交付項目&#xff0c;無論用的是什么平臺。這是一個免費的源代碼&#xff0c;可以處理任何類型的構建或持續集成。集成Jenkins可以用于一些…

MQL5-MT5連接上國內期貨

主要原因是昨天在學習MACD時發現給的基礎代碼感覺不對&#xff0c;但無法證明&#xff0c;因為MT5接的都是外匯交易&#xff0c;數據和國內的文華啥的全對不上&#xff0c;便找了一些國內接CTP的&#xff0c;直接寫代碼有點麻煩&#xff0c;雖然之前對接過國內CTP的東西&#x…

AI入門筆記(三)

神經網絡是如何工作的 神經網絡又是如何工作的呢&#xff1f;我們用一個例子來解釋。我們看下面這張圖片&#xff0c;我們要識別出這些圖片都是0并不難&#xff0c;要怎么交給計算機&#xff0c;讓計算機和我們得出同樣的結果&#xff1f;難點就在于模式識別的答案不標準&…