文章目錄
今天偶然看到一個面試題, 題目是這樣的:
給我們兩個序列,第一個序列表示棧的壓入順序,然後讓判斷第二個序列是不是是否是該棧的彈出序列
現設第一個序列爲[1,2,3,4,5],第二個序列爲[3,2,5,4,1],可以看出這個出棧順序是合法的,那麼我們怎麼通過程序來驗證呢?
思路:
首先要根據棧的先進後出原則, 分析出來的 要比較的一定是題意中 輔助棧s 和 出棧數組stack_out的首個元素是否相等.
相等則是滿足順序, 輔助棧s彈出, 出棧數組stack_out指向下一個元素, 繼續下一步模擬
最後如果輔助棧s空了, 那就說明順序完全相同, 反之不同.
後來看到了一個判斷出棧順序的規律:
對每一個元素,其後所有 小於 此元素值 的元素 是 降序排列的.
eg:
[1,2,3,4,5,6,7,8,9] 合法
[9,8,7,6,5,4,3,2,1] 合法
[4,5,3,2,7,6,1,8,9] 合法
[3,4,5,1,2,9,8,7,6] 非法
/***
* @Author : acmaker
* @Date : 2020-03-20 20:23:20
* @LastEditTime: 2020-03-20 20:53:54
* @FilePath : \myCPlusPlusCode\DataStructure\MoocWork\StackOder.cpp
* @Website : http://csdn.acmaker.vip
* @Description :
*/
#include <bits/stdc++.h>
using namespace std;
bool Check(int stack_in[], int stack_out[] ) {
int len_in = sizeof(stack_in) / sizeof(stack_in[0]), //入棧序列長度
len_out = sizeof(stack_out) / sizeof(stack_out[0]); //出棧序列長度
if ( len_in!=len_out ) return false;
stack<int> s;
for ( int i = 0, j = 0; i < len_in; ++i) {
s.push(stack_in[i]);
while (s.top() == stack_out [j] && s.size()) { //入棧序列棧頂元素與當前出棧序列元素不相等,不合法
s.pop();
++j;
}
}
return (s.size() ? false : true); //當所有出棧序列元素都匹配完之後,棧不爲空,不合法
}
int main() {
int stack_in[] = {1, 2, 3, 4, 5}; //入棧序列
int stack_out[] = {4, 5, 3, 2, 1}; //出棧序列
bool res = Check(stack_in, stack_out);
cout << ( res ? "不合法!" : "合法" ) << endl;
return 0;
}