您好,登錄后才能下訂單哦!
題目:給定一個入棧和一個出棧序列?請判斷是否合法
eg:入棧12345,出棧35124
用一個輔助棧,如果棧為空,就push(入棧序列)
比較棧頂元素和出棧序列當(dāng)前值是否相等,若相等,出棧此元素,并將下次訪問出棧序列位置后移;否則,繼續(xù)入入棧序列里的元素。
重復(fù)1,2步驟,直到入棧序列為空,且棧頂元素不等于出棧序列當(dāng)前訪問位置時即不合法。棧空,入棧序列空,出棧序列空為合法出棧。
此例中將3,5,取出后,明顯1不是棧頂元素,所以不是合法的。
#include<iostream> #include<assert.h> #include<stack> using namespace std; bool IsLegal(const char* inOrder, const char* outOrder) { assert(inOrder&&outOrder); if (strlen(inOrder) != strlen(outOrder)) return false; char* source = (char*)inOrder; char* dest = (char*)outOrder; stack<char> s; char ch; while (!s.empty() || *source != '\0') { while (!s.empty() && s.top()==*dest) { dest++; s.pop(); } if (*source == '\0') break; s.push(*source++); } if (*dest == '\0') return true; else return false; } //法二 class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { if(pushV.size() == 0) return false; vector<int> stack; for(int i = 0,j = 0 ;i < pushV.size();){ stack.push_back(pushV[i++]); while(j < popV.size() && stack.back() == popV[j]){ stack.pop_back(); j++; } } return stack.empty(); } }; void Test1() { cout << IsLegal("12345", "35124") << endl; cout << IsLegal("12345", "54321") << endl; cout << IsLegal("12345", "35421") << endl; cout << IsLegal("12345", "23451") << endl; cout << IsLegal("12345", "12345") << endl; }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。