昨天覆習了一下表示式(棧)和圖論相關的演算法,結果卡在一道題上,上午做的等價表示式,下午才有所進展,最後好不容易寫出來了個像樣的程式,,但又因為落谷和codevs上資料有誤(左右括號不匹配導致r re,例如(a+2)^2)),,折騰半天,最後到vijos上也只是分多了點,,也沒a掉。
兩個棧是肯定的,乙個用來儲存數字,乙個用來儲存符號。
讀入數字時,直接壓入數字棧就可以了,沒必要處理,
讀入符號時:
1.如果是運算子,當前棧頂的運算子優先順序大於等於新運算子,則將棧頂運算子彈出,並將當前數字棧頂的兩個數進行相應運算,彈出舊數,壓入新結果。不停迴圈,直到棧裡面沒有符號或符號優先順序低於當前新運算子。
2.如果是「(」,直接壓入棧。
3.如果是「)」,不需要壓入棧,而是依次將棧裡面的符號彈出,並計算。直到遇到乙個」(「,然後將」(「也彈出(很關鍵,否則就會出現運算子數量大於等於數字的情況)。
那怎麼知道符號棧的符號和哪兩個數字對應呢,需不需要再開乙個陣列來記錄?其實是不需要的,因為題目中不可能出現兩個運算子連在一起的情況,即不會出現4+*3這種情況,即使是「(」或「)」和運算子連在一起,因為我們每遇到乙個「)」就會彈出棧頂元素直至遇到「(」所以不必擔心在彈出的過程中出現運算子大於等於數字的。
具體實現見如下**
/*
my convictions will not falter.--poppy
*/#include
#include
#include
#define n 32767
using
namespace
std;
const
int test=;
long
long sum1,sum2,sum3,n,i,ans1,ans2,ans3;
long
long num[1005];
char s[1005];
char ss[1005];
int high(char c)
long
long qmod(int x,int m,int k)
return a%k;
}long
long work(int p1,int p2,int p3)
int getin(int su)
else
if(c=='a')
num[++t1]=su,p=1;
else
if(c=='(')
s[++t2]='(',p=1;
else
if(c==')'||c=='\0'||c==-1)
t2--;
}else
s[++t2]=c;
p=1;}}
}return num[1]%n;
}int read()
int main()
return
0;}
NOIP2005 等價表示式
等價表示式 equal.pas c cpp 問題描述 明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為...
NOIP 2005 等價表示式
題目描述 明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是...
NOIP2005 等價表示式
明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是可以用計算...