數據結構--棧 codevs 1107 等價表達式

codevs 1107 等價表達式

2005年NOIP全國聯賽提高組

?時間限制: 1 s
?空間限制: 128000 KB
?題目等級 : 鉆石 Diamond
題目描述?Description

明明進了中學之后,學到了代數表達式。有一天,他碰到一個很麻煩的選擇題。這個題目的題干中首先給出了一個代數表達式,然后列出了若干選項,每個選項也是一個代數表達式,題目的要求是判斷選項中哪些代數表達式是和題干中的表達式等價的。

這個題目手算很麻煩,因為明明對計算機編程很感興趣,所以他想是不是可以用計算機來解決這個問題。假設你是明明,能完成這個任務嗎?

這個選擇題中的每個表達式都滿足下面的性質:
1.表達式只可能包含一個變量‘a’。
2.表達式中出現的數都是正整數,而且都小于10000。
3.表達式中可以包括四種運算‘+’(加),‘-’(減),‘*’(乘),‘^’(乘冪),以及小括號‘(’,‘)’。小括號的優先級最高,其次是‘^’,然后是‘*’,最后是‘+’和‘-’。‘+’和‘-’的優先級是相同的。相同優先級的運算從左到右進行。(注意:運算符‘+’,‘-’,‘*’,‘^’以及小括號‘(’,‘)’都是英文字符)
4.冪指數只可能是1到10之間的正整數(包括1和10)。
5.表達式內部,頭部或者尾部都可能有一些多余的空格。
下面是一些合理的表達式的例子:
((a^1)^2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1+(a-1)^3,1^10^9……

輸入描述?Input Description

輸入第一行給出的是題干中的表達式。第二行是一個整數n(2<=n<=26),表示選項的個數。后面n行,每行包括一個選項中的表達式。這n個選項的標號分別是A,B,C,D……

輸入中的表達式的長度都不超過50個字符,而且保證選項中總有表達式和題干中的表達式是等價的。

輸出描述?Output Description

輸出包括一行,這一行包括一系列選項的標號,表示哪些選項是和題干中的表達式等價的。選項的標號按照字母順序排列,而且之間沒有空格。

樣例輸入?Sample Input

(a+1)^2
3
(a-1)^2+4*a
a+1+a
a^2+2*a*1+1^2+10-10+a-a

樣例輸出?Sample Output

AC

數據范圍及提示?Data Size & Hint

【數據規模】
對于30%的數據,表達式中只可能出現兩種運算符‘+’和‘-’;
對于其它的數據,四種運算符‘+’,‘-’,‘*’,‘^’在表達式中都可能出現。
對于全部的數據,表達式中都可能出現小括號‘(’和‘)’。

  1 /*
  2 機智的方法:給a代入特殊值。不要代入0,1,-1這樣的數。最好代質數。
  3 只代入一個數還是很有可能出現兩個不等的式子算出來結果相等。
  4 多代幾個數
  5 還有一個問題,代數的話,計算結果可能會超過long long范圍。
  6 計算的時候記得模一個大質數
  7 因為我們取了若干個數代進去,所以即使模了一個數沖突的幾率也很小
  8 下面進入正題:如何計算表達式的值?
  9 我們需要開兩個棧:一個用來存儲數字,一個用來存儲符號。
 10 讀入數字時,壓入數字棧
 11 讀入符號時:
 12 1.如果是運算符,當前棧頂的運算符優先級大于等于新運算符,則將棧頂運算符彈出,并將當前數字棧頂的兩個數進行相應運算,彈出舊數,壓入新結果。不停循環,直到棧里面沒有符號或符號優先級低于當前新運算符。
 13 2.如果是(,直接壓入棧。
 14 3.如果是),則依次將棧里面的符號彈出,并計算。直到遇到一個(。
 15 
 16 */
 17 #include<cstring>
 18 #include<iostream>
 19 using namespace std;
 20 #include<cstdio>
 21 #define mod 32767
 22 #define max_len 10
 23 #define L 55
 24 char s[L],b[L],n;
 25 int ans[max_len+5];
 26 int sumstack[L],fhstack[L];
 27 int len1=0,len2=0;
 28 int quick_mod(int x,int y)//x^y
 29 {
 30     int ret=1;
 31     while(y)
 32     {
 33         if(y&1)
 34         {
 35             ret*=x;
 36             ret%=mod;
 37         }
 38         y>>=1;x*=x;
 39         x%=mod;
 40     }
 41     return ret;
 42 }
 43 void multi()
 44 {
 45     switch(fhstack[len2])
 46     {
 47         case 1:sumstack[len1-1]+=sumstack[len1];
 48                sumstack[len1-1]%=mod;
 49                break;
 50         case 2:sumstack[len1-1]-=sumstack[len1];
 51                sumstack[len1-1]%=mod;
 52                break;
 53         case 3:sumstack[len1-1]*=sumstack[len1];
 54                sumstack[len1-1]%=mod;
 55                break;
 56         case 4:sumstack[len1-1]=quick_mod(sumstack[len1-1],sumstack[len1]);
 57                sumstack[len1-1]%=mod;
 58                break;
 59         case 5:len2--; return;/*遇到左括號,直接跳過,是符號棧指針--*/
 60     }
 61     len1--;len2--;
 62 }
 63 int js(char s1[],int k)
 64 {
 65     memset(sumstack,0,sizeof(sumstack));
 66     memset(fhstack,0,sizeof(fhstack));
 67     sumstack[1]=0;len1=1;
 68     len2=0;
 69     int len=strlen(s1);
 70     for(int i=0;i<len;++i)
 71     {
 72         if(s1[i]==' ') continue;
 73         if(s1[i]=='a')
 74         {
 75             sumstack[++len1]=k;
 76             continue;
 77         }
 78         if(s1[i]>='0'&&s1[i]<='9')
 79         {
 80             sumstack[++len1]=s1[i]-'0';
 81             while(s1[i+1]>='0'&&s1[i+1]<='9')
 82             {
 83                 sumstack[len1]=sumstack[len1]*10+s1[i+1]-'0';
 84                 sumstack[len1]%=mod;
 85                 i++;
 86             }
 87             continue;
 88         }
 89         switch(s1[i])
 90         {
 91             case '(': fhstack[++len2]=5;break;
 92             case '+':while(len2>0&&fhstack[len2]>0&&fhstack[len2]<5) multi();
 93                      fhstack[++len2]=1;
 94                      break;
 95 /*注意這里的是while,不是if,就是如果滿足條件的話,就把前面的一直算*/
 96             case '-':while(len2>0&&fhstack[len2]>0&&fhstack[len2]<5) multi();
 97                      fhstack[++len2]=2;
 98                      break;
 99             case '*':while(len2>0&&fhstack[len2]>2&&fhstack[len2]<5) multi();
100                      fhstack[++len2]=3;
101                      break;
102             case '^':while(len2>0&&fhstack[len2]>3&&fhstack[len2]<5) multi();
103                      fhstack[++len2]=4;
104                      break;
105             case ')':while(len2>0&&fhstack[len2]<5) multi();
106                      if(fhstack[len2]==5) len2--;
107                      break;
108         }
109     }
110     while(len2) multi();
111     if(len1==1) return (sumstack[1]+mod)%mod;
112     return (sumstack[2]+mod)%mod;
113 }
114 int main()
115 {
116     gets(s);
117     for(int i=1;i<max_len;++i)
118       ans[i]=js(s,i);
119     scanf("%d\n",&n);
120     for(int i=1;i<=n;++i)
121     {
122         gets(b);
123         bool flag=true;
124         for(int i=1;i<max_len;++i)
125         {
126             int x=js(b,i);
127             if(x!=ans[i])
128             {
129                 flag=false;
130                 break;
131             }
132         }
133         if(flag) 
134           printf("%c",'A'-1+i);
135     }
136     return 0;
137 }

?

轉載于:https://www.cnblogs.com/c1299401227/p/5767231.html

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

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

相關文章

目標檢測的圖像特征提取之(二)LBP特征

LBP特征實質是&#xff1a;圖像局部特征的提取 意義&#xff1a;紋理的提取 http://blog.csdn.net/zouxy09/article/details/7929531 1&#xff09;首先將檢測窗口劃分為1616的小區域&#xff08;cell&#xff09;&#xff1b; &#xff08;2&#xff09;對于每個cell中的一個…

VS2010安裝幫助文檔出現錯誤

安裝VS2010后的幫助文檔安裝出現錯誤:未能在指定文件夾中創建本地存儲區 安裝完VS2010后&#xff0c;出現錯誤&#xff0c;取消后 再安裝MSDN 打開“Help Library 管理器 - Microsoft Help 查看器 1.0” 提示“請為本地內容選擇位置” 默認的位置是在“C:\Documents and Settin…

matlab smulink筆記03——過零檢測

★過零檢測 變步長解算方法動態地評估計算下一個采樣時刻所使用的步長&#xff0c;當前后兩個采 樣點的狀態值變化大時&#xff0c;則縮小采樣步長&#xff0c;當前后兩個采樣點的值變化小時則增大步 這種做法使得解算器在計算不連續臨近區域時使用較小的步長&#xff0c;因為不…

電腦下鄉的遐想

最近討論家電下鄉的話題很熱&#xff0c;其中我個人最關心“電腦下鄉”。原因是&#xff0c;我是農村人&#xff0c;正好在電腦相關行業里混。 應當說&#xff0c;讓電腦下鄉是我多年的夢想&#xff0c;我多么盼望鄉下的鄉親們能夠上網看新聞、學習、看電視……但是&#xff0c…

angularjs學習曲線

angularjs學習曲線 剛開始學Augular覺得開發應用需要有相當的編程基礎. 不得不說這確實是一款了不起的開發框架&#xff0c;它要求開發人員設計低耦合和可維護的應用. 使用AngularJS 的復雜度就像使用PHP&#xff0c;Ruby on Rails等等, 都需要處理依賴注入&#xff0c;路由&am…

HttpWebRequest post上傳文件

public static string HttpUploadFile(string url, string path){// 設置參數 HttpWebRequest request WebRequest.Create(url) as HttpWebRequest;CookieContainer cookieContainer new CookieContainer();request.CookieContainer cookieContainer;request.AllowAutoRedir…

文章標題

**1>MSVCRTD.lib(exe_main.obj) : error LNK2019: 無法解析的外部符號 main&#xff0c;該符號在函數 “int __cdecl invoke_main(void)” (?invoke_mainYAHXZ) 中被引用 1>D:\vs2015-code\Imae_Client\x64\Debug\Imae_Client.exe : fatal error LNK1120: 1 個無法解析…

matlab simulink筆記04——switch模塊

Switch 模塊 Switch模塊是-.個選擇開關模塊,可根據判斷條件選擇多個輸入端口中的某個進行輸出。圖所示為CommonlyUsedBlocks中具有3個輸入端口.1個輸出端口的Switch模塊圖標。模塊的3個端口中,第1個和第3個端口為輸出端口提供輸出值,輸出端口輸出第1個輸人口還是第3個輸人口的值…

[Ajax]ajax學習與理解

1.新建demo.aspx頁面。2.首先在該頁面的后臺文件demos.aspx.cs中添加引用。 using System.Web.Services;3.無參數的方法調用. 大家注意了&#xff0c;這個版本不能低于.net framework 2.0。2.0已下不支持的。后臺代碼&#xff1a; [WebMethod] public static string SayHel…

優化Web網站性能

一、前端優化網站性能優化是一個很綜合的話題&#xff0c;涉及到服務器的配置和網站前后端程序等各個方面&#xff0c;我只是從實際經歷出發&#xff0c;分享一下自己所嘗試過的網站性能優化方法。之所以在標題上掛一個web2.0&#xff0c;是因為本文更偏重于中小網站的性能優化…

Gym - 100851F Froggy Ford kruskal

題目鏈接&#xff1a; http://acm.hust.edu.cn/vjudge/problem/307216Froggy FordTime Limit: 3000MS題意 青蛙過河&#xff0c;河中有若干個石頭&#xff0c;現在你可以加一個石頭&#xff0c;使得青蛙從左岸跳到右岸的最大跳躍距離最小。 題解 把左岸和右岸作為兩個虛節點&am…

Tesseract入門-VS2015下調用Tesseract4.0 +win7 64位系統

本文是基于最近的OCR識別項目學習ocr開源庫-tesseract的簡單調用&#xff0c;不涉及其余視覺知識。 參考文獻&#xff1a;http://blog.csdn.net/u012566751/article/details/54136836 參考庫&#xff1a;http://download.csdn.net/download/u010554381/10044876 1.預備工作 …

authconfig命令解析_學習筆記

時間&#xff1a;2017.11.16作者&#xff1a;李強參考&#xff1a;man,info&#xff0c;magedu講義聲明&#xff1a;以下英文純屬個人翻譯&#xff0c;英文B級&#xff0c;歡迎糾正&#xff0c;盜版不糾,才能有限&#xff0c;希望不誤人子弟為好。1、使用目的與場景先列在這里&…

matlab simulinK筆記06——代數環

★代數環 代數環,就是由于模型的輸出反饋到模塊或子系統的某個輸入端&#xff0c;如果這個輸入 是直接饋入的&#xff0c;那么二者在同一個采樣點內需得到求解&#xff0c;但又互相依賴,哪一方都不 能完成求解過程&#xff0c;使得解算器無法解算導致錯誤產生&#xff0c;這樣的…

PHP多種序列化/反序列化的方法 (轉載)

1. serialize和unserialize函數 這兩個是序列化和反序列化PHP中數據的常用函數。 <?php$a array(a > Apple ,b > banana , c > Coconut);//序列化數組 $s serialize($a); echo $s; //輸出結果&#xff1a;a:3:{s:1:"a";s:5:"Apple";s:1:&qu…

基于python3的Opencv(一)-打開攝像頭顯示圖像

基于Python3的Opencv學習&#xff1a; import cv2 as cv def video_demo(): #0是代表攝像頭編號&#xff0c;只有一個的話默認為0capturecv.VideoCapture(0) while(True):ref,framecapture.read()cv.imshow("1",frame) #等待30ms顯示圖像&#xff0c;若過程中按“Esc…

.Net中的AOP系列之《方法執行前后——邊界切面》

返回《.Net中的AOP》系列學習總目錄 本篇目錄 邊界切面 PostSharp方法邊界方法邊界 VS 方法攔截ASP.NET HttpModule邊界真實案例——檢查是否為移動端用戶真實案例——緩存小結本系列的源碼本人已托管于Coding上&#xff1a;點擊查看。 本系列的實驗環境&#xff1a;VS 2013 Up…

matlab simulink筆記06 —— 利用simulink求解微分方程/simulink框圖與控制系統框圖的區別

目錄 1.利用integrator求解微分方程 1.1求解步驟 1.2例子 2.simulink框圖與控制系統框圖的區別 本人剛開始學習simulink,總是會將simulink框圖和控制系統框圖混淆,導致最后不能正確的根據simulink框圖得到相應的微

ubuntu搭建svn、git遇到的問題及解決辦法

不錯的git筆記博客&#xff1a; http://www.cnblogs.com/wanqieddy/category/406859.html http://blog.csdn.net/zxncvb/article/details/22153019 Git學習教程&#xff08;六&#xff09;Git日志 http://fsjoy.blog.51cto.com/318484/245261/ 圖解git http://my.oschina.net/x…

PHP IDE phpstorm 快捷鍵

這篇文章主要介紹了PHP IDE phpstorm 常用快捷鍵,本文分別列出了mac系統和Windows系統下的phpstorm快捷鍵,需要的朋友可以參考下 一、mac電腦phpstorm快捷鍵 command a 全選 command c 復制 command v 粘貼 command z 撤消 command k 代碼搜索 command l 輸入行號跳到某一…