左神算法书籍《程序员代码面试指南》——1_05用一个栈实现另一个栈的排序

【题目】

一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,
只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。
如何完成排序?

【题解】

将要排序的栈记为stack,申请的辅助栈记为help。在stack上执行pop操作,弹出的元素记为cur。
·如果cur小于或等于help的栈顶元素,则将cur直接压入help;
·如果cur大于help的栈顶元素,则将help的元素逐一弹出,
逐一压入stack,直到cur小于或等于help的栈顶元素,再将cur压入help。
一直执行以上操作,直到stack中的全部元素都压入到help。
最后将help中的所有元素逐一压入stack,即完成排序。

【代码】

 1 #pragma once
 2 #include <iostream>
 3 #include <stack>
 4 
 5 using namespace std;
 6 
 7 //一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,
 8 //只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。
 9 //如何完成排序?
10 //
11 //我的想法就是有n个数,那就倒腾n次,每次找到一个最小值
12 //将要排序的栈记为stack,申请的辅助栈记为help。在stack上执行pop操作,弹出的元素记为cur。
13 //·如果cur小于或等于help的栈顶元素,则将cur直接压入help;
14 //·如果cur大于help的栈顶元素,则将help的元素逐一弹出,
15 //    逐一压入stack,直到cur小于或等于help的栈顶元素,再将cur压入help。
16 //一直执行以上操作,直到stack中的全部元素都压入到help。
17 //    最后将help中的所有元素逐一压入stack,即完成排序。
18 
19 
20 
21 void stackSort(stack<int>&s)
22 {
23     if (s.size() < 2)
24         return;
25     stack<int>h;
26     while (!s.empty())
27     {
28         int a = s.top();
29         s.pop();
30         while (!h.empty() && a > h.top())//当原栈顶元素大于h栈顶元素,将h栈数据全部弹出
31         {
32             s.push(h.top());
33             h.pop();
34         }
35         h.push(a);
36     }
37     while (!h.empty())//排好的数据返回给原栈
38     {
39         s.push(h.top());
40         h.pop();
41     }
42 }
43 
44 
45 void printStack(stack<int>s)
46 {
47     while (!s.empty())
48     {
49         cout << s.top() << " ";
50         s.pop();
51     }
52     cout << endl;
53 }
54 
55 void Test()
56 {
57     stack<int>s;
58     s.push(5);
59     s.push(2);
60     s.push(3);
61     s.push(4);
62     s.push(1);
63     printStack(s);
64     stackSort(s);
65     printStack(s);
66 }
原文地址:https://www.cnblogs.com/zzw1024/p/11170573.html