重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
之前我們對棧已經有所了解,先進后出,后進先出這是棧的兩大特性,那么,我們經常會碰到這種題,例:
雙湖網站制作公司哪家好,找成都創新互聯公司!從網頁設計、網站建設、微信開發、APP開發、自適應網站建設等網站項目制作,到程序開發,運營維護。成都創新互聯公司從2013年成立到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選成都創新互聯公司。
有一組元素abcdef,按先后順序進棧,那么出棧時哪些情況是非法的?
A. fedcba
B. abdcef
C. acbdef
D. abcdef
選哪個呢???
很明顯,根據棧的兩大特性:先進后出,后進先出,即可判斷,答案:C
剖析: 先看C選項acb這樣的出棧序列,那么進棧肯定是abc,那么顯然出棧時c肯定不會在b之前,就這么簡單。用代碼實現這個合法性的判斷,當然也是比較容易的,只要思路邏輯清楚,就沒有問題。
代碼如下:
#include#include #include using namespace std; bool isLegalSequence(const char* Push_seq,const char* Pop_seq) { assert(Push_seq); assert(Pop_seq); //判斷出入棧序列長度是否相等 if ( strlen(Push_seq) != strlen(Pop_seq) ) return false; stack stk; while ( *Push_seq) { // 先判斷棧是否為空,然后判斷棧頂元素是否和出棧序列的元素相同 if (0 == stk.size() || stk.top() != *Pop_seq) { stk.push(*Push_seq++); // 不相同就壓棧,繼續向后找 } else { stk.pop(); //找到相同的,出棧 ++Pop_seq; //跳到出棧序列的下一個元素驗證 } } while (stk.size()) // 將剩余的出棧序列元素判斷 { if (stk.top() != *Pop_seq) { return false; } stk.pop(); } return true; } int main() { char* str1 = "abcdef"; char* str2 = "baedcf"; cout << ( isLegalSequence(str1, str2) ? "yes" : "no" ) << endl; system("pause"); return 0; }
由于系統的棧是現成的,我們可以直接拿來使用,這樣問題大大簡化,具體的實現步驟過程,代碼中也有注釋,簡單易懂。