1002 雙棧排序

2021-07-23 20:48:49 字數 2104 閱讀 6011

description

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)排序的操作序列a,c,c,b,a,d,d,b

當然,這樣的操作序列有可能有幾個,對於上例(1,3,2,4),a,c,c,b,a,d,d,b是另外乙個可行的操作序列。tom希望知道其中字典序最小的操作序列是什麼。

input

輸入有多組case,每個case第一行是乙個整數n(n<=1000)。

第二行有n個用空格隔開的正整數,構成乙個1~n的排列。

output

每組case輸出一行,如果輸入的排列不是「可雙棧排序排列」,輸出數字0;否則輸出字典序最小的操作序列,每兩個操作之間用空格隔開,行尾沒有空格。

sample input

copy sample input to clipboard

4 1 3 2 4

4 2 3 4 1

sample output

a b a a b b a b

0

// problem#: 19143

// submission#: 4809694

// the source code is licensed under creative commons attribution-noncommercial-sharealike 3.0 unported license

// uri:

#include

#include

#include

#include

#include

#define max 1000 + 1

using

namespace

std;

int input[max];

// the min num after each pos

int inputmin[max];

bool edge[max][max];

// 0 for initial, 1 for s1, 2 for s2

// (3 - color) for calculate the other color

int color[max];

stack

s1, s2;

bool isunable;

void initialize()

}isunable = false;

}void calmin(int size)

}void linkedge(int size) }}

}void dfs_dye(int pos, int _color, int size) else

if (color[i] == 0)}}

}void dye(int size)

}}void stacksort(int size)

int current = 1;

string s;

for (int i = 0; i < size; i++) else

while ((!s1.empty() && s1.top() == current) ||

(!s2.empty() && s2.top() == current)) else

current++;}}

for (int i = 0; i < s.size() - 1; i++) cout

<< s[i];

cout

<< endl;

}int main()

}return

0;}

雙棧排序練習

題目 請編寫乙個程式,按公升序對棧進行排序 即最大元素位於棧頂 要求最多只能使用乙個額外的棧存放臨時資料,但不得將元素複製到別的資料結構中。給定乙個int numbers c 中為vector 其中第乙個元素為棧頂,請返回排序後的棧。請注意這是乙個棧,意味著排序過程中你只能訪問到第乙個元素。解題思路...

nowcoder 雙棧排序

請編寫乙個程式,按公升序對棧進行排序 即最大元素位於棧頂 要求最多只能使用乙個額外的棧存放臨時資料,但不得將元素複製到別的資料結構中。給定乙個int numbers c 中為vector 其中第乙個元素為棧頂,請返回排序後的棧。請注意這是乙個棧,意味著排序過程中你只能訪問到第乙個元素。測試樣例 1,...

C 雙棧排序

請編寫乙個程式,按公升序對棧進行排序 即最大元素位於棧頂 要求最多只能使用乙個額外的棧存放臨時資料,但不得將元素複製到別的資料結構中。給定乙個int numbers c 中為vector 其中第乙個元素為棧頂,請返回排序後的棧。請注意這是乙個棧,意味著排序過程中你只能訪問到最後乙個元素。演算法 題目...