日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[大牛就是牛]双栈排序

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [大牛就是牛]双栈排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目描述】

  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希望知道其中字典序最小的操作序列是什么。

【輸入格式】

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

【輸出格式】

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

【輸入樣例】

3
2 3 1
【輸出樣例】

a c a b b d
【分析】

  大家看看SQYBI大牛的題解吧:http://sqybi.com/blog/archives/78

?

#include <stdio.h> #include <iostream> #define MAXN 1010 using namespace std; int a[MAXN],zhan[3][MAXN],color[MAXN],f[MAXN]; int now,n; bool wujie; struct tnode {int num;tnode *next; } g[MAXN],*t; void insert(int x,tnode &p) {t = new(tnode);t->num = x;t->next = p.next;p.next = t; } void dfs(int x) {tnode *tt;tt = g[x].next;while (tt != NULL) {int y = tt->num;if (!color[y]) {color[y] = 3 - color[x];dfs(y);}if (color[y] == color[x]) {wujie = 1;return;}tt = tt->next;} } int main() {scanf("%d",&n);for (int i = 1;i <= n;++i)scanf("%d",&a[i]);f[n + 1] = 1000000000;for (int i = n;i > 0;--i)f[i] = min(a[i],f[i + 1]);for (int i = 1;i <= n;++i)for (int j = i + 1;j <= n;++j)if ((a[i] < a[j]) && (f[j + 1] < a[i])) {insert(j,g[i]);insert(i,g[j]);}for (int i = 1;i <= n;++i)if (!color[i]) {color[i] = 1;dfs(i);if (wujie)break;}if (wujie) {printf("0\n");return 0;}now = 1;for (int i = 1;i <= n;++i) {int x = color[i];zhan[x][++zhan[x][0]] = i;if (x == 1)printf("a ");elseprintf("c ");while ((a[zhan[1][zhan[1][0]]] == now) || (a[zhan[2][zhan[2][0]]] == now)) {if (a[zhan[1][zhan[1][0]]] == now) {printf("b ");--zhan[1][0];} else {printf("d ");--zhan[2][0];}++now;}} }

轉載于:https://www.cnblogs.com/sephirothlee/archive/2010/10/12/1849154.html

總結

以上是生活随笔為你收集整理的[大牛就是牛]双栈排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。