經發現,如果是三個數的情況下,不合法的順序只有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...