【題目描述】
tom最近在研究乙個有趣的排序問題。如圖所示,通過2個棧s1和s2,tom希望借助以下4種操作實現將輸入序列公升序排序。
操作a
如果輸入序列不為空,將第乙個元素壓入棧s1
操作b
如果棧s1不為空,將s1棧頂元素彈出至輸出序列
操作c
如果輸入序列不為空,將第乙個元素壓入棧s2
操作d
如果棧s2不為空,將s2棧頂元素彈出至輸出序列
如果乙個1~n的排列p可以通過一系列操作使得輸出序列為1, 2,…,(n-1), n,tom就稱p是乙個"可雙棧排序排列"。例如(1, 3, 2, 4)就是乙個"可雙棧排序序列",而(2, 3, 4, 1)不是。下圖描述了乙個將(1, 3, 2, 4)排序的操作序列:
當然,這樣的操作序列有可能有幾個,對於上例(1, 3, 2, 4),是另外乙個可行的操作序列。tom希望知道其中字典序最小的操作序列是什麼。
【輸入格式】
輸入的第一行是乙個整數n。第二行有n個用空格隔開的正整數,構成乙個1~n的排列。
【輸出格式】
輸出共一行,如果輸入的排列不是"可雙棧排序排列",輸出數字0;否則輸出字典序最小的操作序列,每兩個操作之間用空格隔開,行尾沒有空格。
【輸入樣例】
3
2 3 1
【輸出樣例】
a c a b b d
【分析】
#include #include #define maxn 1010using namespace std;
int a[maxn],zhan[3][maxn],color[maxn],f[maxn];
int now,n;
bool wujie;
struct tnode g[maxn],*t;
void insert(int x,tnode &p)
void dfs(int x)
if (color[y] == color[x])
tt = tt->next;
}}int main()
for (int i = 1;i <= n;++i)
if (!color[i])
if (wujie)
now = 1;
for (int i = 1;i <= n;++i) else
++now;}}}
牛客 雙棧排序 niop
菜雞還沒學二分圖。題意 給定乙個序列,問能否雙棧排序,如果能,請輸出字典序最小的方案 操作a 如果輸入序列不為空,將第乙個元素壓入棧s1 操作b 如果棧s1不為空,將s1棧頂元素彈出至輸出序列 操作c 如果輸入序列不為空,將第乙個元素壓入棧s2 操作d 如果棧s2不為空,將s2棧頂元素彈出至輸出序列...
1002 雙棧排序
description tom最近在研究乙個有趣的排序問題。如圖所示,通過2個棧s1和s2,tom希望借助以下4種操作實現將輸入序列公升序排序。操作a 如果輸入序列不為空,將第乙個元素壓入棧s1 操作b 如果棧s1不為空,將s1棧頂元素彈出至輸出序列 操作c 如果輸入序列不為空,將第乙個元素壓入棧s...
雙棧排序練習
題目 請編寫乙個程式,按公升序對棧進行排序 即最大元素位於棧頂 要求最多只能使用乙個額外的棧存放臨時資料,但不得將元素複製到別的資料結構中。給定乙個int numbers c 中為vector 其中第乙個元素為棧頂,請返回排序後的棧。請注意這是乙個棧,意味著排序過程中你只能訪問到第乙個元素。解題思路...