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

匿名 (未验证) 提交于 2019-12-02 23:47:01

【题目】

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

【题解】

将要排序的栈记为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 }

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!