大牛就是牛 雙棧排序

2022-03-21 06:55:55 字數 1397 閱讀 4464

【題目描述】

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 1010

using 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 其中第乙個元素為棧頂,請返回排序後的棧。請注意這是乙個棧,意味著排序過程中你只能訪問到第乙個元素。解題思路...