左神算法书籍《程序员代码面试指南》——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 }