這是某資訊APP公司的面試題。
數1,2,3,...,n按從小到大的順序入棧,給定一個序列,判斷其是否爲一個正確的出棧序列。比如n=5,則“1,4,3,5,2”是一個正確的出棧序列,而"5,4,3,1,2"不是。
方法是用一個輔助棧保存原棧中未出棧的數,遇到下一個數時,判斷其是否符合出棧規則。代碼如下
#include <iostream>
#include <stack>
using namespace std;
bool rightOrder(int a[], int n) {
int i, j, m = 0; //m記錄之前出棧的最大值
stack<int> s; //未出棧的數保存在輔助棧s中
for (i=0; i<n; i++) {
if (a[i] > m + 1) {
for (j=m+1; j<a[i]; j++) {
s.push(j);
}
m = a[i];
}
if (a[i] == m + 1) {
m = a[i];
}
if (a[i] < m) {
if (a[i] == s.top()) {
s.pop();
} else {
return false;
}
}
}
return true;
}
void main() {
int a[] = {1,4,3,5,2};
cout << rightOrder(a, 5) << endl;
}