嗨,大家好,我今天繼續來練習stack的用法,以下是我自己的解題心得,想跟大家討論,有任何問題歡迎提出一起討論喔~ --- ## 以下是我的程式碼 ``` #include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); // 快速 I/O cin.tie(0); // 解綁 cin 與 cout int n; cin>>n; for(int j=0;j<n;j++){ string s; int nump=0; stack <int> st; //input cin>>s; //count for(int i=0;i<s.size();i++){ if(s[i]=='p'){ nump++; st.push(1); //1代表有一個p在裡面 } else if(s[i]=='q'){ if(!st.empty()){ st.pop(); } } } cout<<nump-st.size()<<endl; } } ``` --- 接著下來是每一部分的說明 ## 第一部分 ``` ios::sync_with_stdio(false); // 快速 I/O cin.tie(0); // 解綁 cin 與 cout ``` 首先來說說快速I/O的部分 **ios::sync_with_stdio**的全名是: synchronize with standard input/output 意思是「與標準輸入輸出(stdio)同步 在預設的情況是有啟用這個功能的,這個時候C++ 的 cin/cout 會和 C 的scanf/printf 共享同一個緩衝區,也就是每次輸入輸出都會檢查兩邊的緩衝區狀態確保沒有順序錯亂,這樣會花比較多的時間來同步檢查 當你關掉這個功能的時候,C++ 與 C 的緩衝區會獨立管理,不用做同步檢查。我是想成,向程式保證:「我只用 C++ 的 cin/cout,不會混用 C 的 scanf/printf。」這樣它就會放心分開管理緩衝區,幫你加速。 接著是解綁 cin 與 cout的部分 在預設情況下,每次從 cin 讀取輸入之前,cout 會自動flush(清空) 緩衝區,把緩衝區的的東西都印出來。 如果你把這個功能關掉,在cin時就不會自動幫你輸出緩衝區的東西,雖然這樣做可能會導致輸出跟你想的不一樣(可能內容留在緩衝區沒有印出來),但是可以提高輸出效率 ps :當你想要換行的時候,輸入<<endl,那程式會自動 flush ,不管你有沒有用 cin.tie(0);喔~ --- ## 第二部分 ``` int n; cin>>n; for(int j=0;j<n;j++){ string s; int nump=0; stack <int> st; //input cin>>s; ``` 這裡是一些輸入的初始設定跟變數宣告,其中有一個我們等等會用到的核心東西 **stack容器** --- ## 第三部分 ``` //count for(int i=0;i<s.size();i++){ if(s[i]=='p'){ nump++; st.push(1); //1代表有一個p在裡面 } else if(s[i]=='q'){ if(!st.empty()){ st.pop(); } } } ``` 好,這裡講解一下我的想法 首先我設了三個流程 1. 算總共有幾個p 2. 如果遇到p就把他push進去stack,如果遇到q則是pop出stack裡面的東西。換句話說,stack裡面只會有p存在(程式裡用1代替),這些p是還沒有配對成功的,當今天有q出現,那就代表配對成功,我就把stack裡面的一個p拿走,但是這裡要注意,如果stack裡面是空的(也就是沒有人在等待配對),那這時候就不能再使用pop了喔,所以我寫了`!st.empty()`來檢測stack是不是空的 3. 結算stack元素數量(有多少人沒有配對成功) --- ## 第四部份 ``` cout<<nump-st.size()<<endl; ``` 最後用我們1.算出的p總數,扣掉沒有配對成功的,最後就剩下有成功配對的人囉~ 這邊要留意一個地方,前面我有提到我用了cin.tie(0);來解綁,所以你可以試試看,把<<endl拿掉,你會發現竟然沒有輸出! 所以以後在用cin.tie(0);的時候要注意,記得加上 << flush; 或是<<endl;喔 以上就是我關於這一提的想法跟心得,如果有那裡看不太懂的,歡迎一起討論喔~
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up