Poj1363 判斷合法棧序列

2021-10-13 23:19:53 字數 1858 閱讀 3486

經發現,如果是三個數的情況下,不合法的順序只有312,也就是乙個數最大第二個數最小的情況下,出棧序列是不合法的,原先我是只比較相連的三個序列,經老師提醒應該是全域性的三個數進行比較。

#include

#include

#include

using namespace std;

const

int maxn =

1000+5

;int a[maxn]

;int n;

bool judge()

}return true;

}int

main()

}if(flag)

break

;else}}

return0;

}

這種方法雖然可以解決問題,但是由於有三重遍歷,實際上的時間複雜度為o(n^3)還是比較高的,可行但不可取

使用棧模擬的方式進行,當新建的棧按照需判斷的數字序列模擬能使得棧為空,說明該數字序列就是合法的

#include

#include

#include

#include

//#define cout fout

using namespace std;

//ofstream fout("result.txt");

const

int maxn =

1000+10

;int a[maxn]

,n;void

tpop

(stack<

int>

&q1,stack<

int>

&q2)

}int

main()

}if(flag)

break

;else

if(q1.

empty()

) cout <<

"yes"

<< endl;

else

cout <<

"no"

<< endl;}}

cout << endl;

}return0;

}

#include

#include

using namespace std;

const

int maxn =

1000+10

;int n, target[maxn]

;int

main()

elseif(

!s.empty()

&& s.

top(

)== target[b]

)//之前堆積的資料和現在相同時彈出並往下走

else

if(a <= n)

//要不然把資料壓到棧中

s.push

(a++);

else

//知道a走完棧空

}printf

("%s\n"

, ok ?

"yes"

:"no");

}return0;

}

這種方式下判斷,時間複雜度應該是o(n)級別的。

**實現一,是我自己實現的**,但有需要改進的地方,就是直接可以用佇列儲存需要判斷的數字序列,棧儲存模擬棧,進行判斷即可,而我的那種方式,是將資料放進陣列中,再反向儲存到棧中,不免有些麻煩;

**實現二,是《演算法競賽入門經典》中提供的**,好處在於節省了空間,只用a,b兩個人變數來標識,且也沒用到棧的資料結構,缺點就是剛開始看有點點難理解。

poj 1363 判斷棧序列是否合法

已知從1到n的數字序列,按順序入棧,每個數字入棧後即可出棧,也可在棧中停留,等待後面的數字入棧出棧後,該數字再出棧,求該數字序列的出棧序列是否合法 比如 3 2 5 4 1 合法序列 3 1 2 4 5 不合法序列 因為1肯定比2先入棧,所以1不可能比2先出棧 思路 為了測試出棧序列是否正確,將元素...

POJ1363驗證出棧序列問題

此題只需驗證是否為合法的出棧序列。有兩個思路 1 每個已出棧之後的數且小於此數的數都必須按降序排列。複雜度o n 2 適合人腦。2 另乙個思路就是直接模擬入棧出棧過程。雖然模擬毫無技巧可言,但複雜度o n 優於演算法1。適合電腦。如下 for i 0 i n i stack.pop else if ...

POJ 1363 Rails 合法的出棧序列

使用棧與佇列模擬入棧 出棧過程 輸入輸出格式搗鼓了半天 include include include include include include include include using namespace std typedef long long ll const int mod 100...