題目:給定一個入棧和一個出棧序列?請判斷是否合法
eg:入棧12345,出棧35124
用一個輔助棧,如果棧為空,就push(入棧序列)
比較棧頂元素和出棧序列當前值是否相等,若相等,出棧此元素,并將下次訪問出棧序列位置后移;否則,繼續入入棧序列里的元素。
重復1,2步驟,直到入棧序列為空,且棧頂元素不等于出棧序列當前訪問位置時即不合法。???,入棧序列空,出棧序列空為合法出棧。
此例中將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;
}免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。