棧和佇列面試題(三)
阿新 • • 發佈:2019-01-03
4.元素出棧入棧的合法性,如入棧的序列(1,2,3,4,5),出棧的序列為(4,5,3,2,1).
思想:先入棧一個元素,將出棧序列的第一個元素和該棧的棧頂元素比較,如果相同,那就讓該元素出棧且出棧序列往後走一個,如果不相同,就按照入棧序列再把下一個元素入棧,再接著把棧頂元素和出棧元素進行比較,就這樣迴圈比較,直到出棧序列為空,如果棧也為空,說明該出棧序列是合法的,否則就是不合法的。
例如:入棧序列為(1,2,3,4,5),出棧序列為(4,5,3,2,1)
(1)先判斷入棧字串長度和出棧字串長度是否相等,如果不相等,那就直接是不合法的出棧序列,若相等,就進行第二步。
(2)如圖:
程式碼實現:
//元素出棧入棧的合法性 #include <iostream> #include <stack> #include <assert.h> using namespace std; template<class T> class IsLegality { public: bool Islegality(const T* str1, const T* str2,size_t size1,size_t size2) { assert(str1); assert(str2); if (size1 != size2) { return false; } /*size_t j = 0; for (size_t i = 0; i < size1; ++i) { s.push(str1[i]); if (s.top() == str2[j]) { s.pop(); j++; while (!s.empty() && s.top() == str2[j]) { s.pop(); j++; } } } while (!s.empty()) { if (s.top() == str2[j]) { s.pop(); j++; } else { return false; } if (j == size1) { return true; } else { return false; } }*/ while(*str1 != '\0'&&*str2 != '\0') { s.push(*str1++); if (s.top() != *str2) { s.push(*str1++); } while(!s.empty()&&s.top() == *str2) { s.pop(); ++str2; } } return s.empty() ? true : false; } private: stack<T> s; };
Test.cpp
void Test()
{
char* str1 = "123456";
char* str2 = "654321";
IsLegality<char> i;
cout << i.Islegality(str1,str2,7,7) << endl;
//cout << Islegality(str1, str2) << endl;
}