(施工中...)
描述:
给你一个1到n的排列和一个栈,入栈顺序给定。你要在不打乱入栈顺序的情况下,仅利用入栈和出栈两种操作,对数组进行从大到小排序,输出排序结果。当无法完全排序时,请输出字典序最大的出栈序列。
方法一:暴力破解法
我们可以找到一个规律:
步骤一:找出整个数组中的最大值;
步骤二:将该最大值之前的数全部插入栈中;
步骤三:在未插入栈中的数组中找到最大值;
步骤四:将该最大值与栈顶值比较,如果栈顶值大于该最大值,则出栈,直到栈顶值小于该最大值,然后回到步骤二,直到全部元素入栈;
步骤五:栈中全部元素出栈。
class Solution { public: /** * 栈排序 * @param a int整型一维数组 描述入栈顺序 * @param aLen int a数组长度 * @return int整型vector */ int searchMax(int* a, int len) { int maxNum = a[0]; for (int i = 1; i < len; i++) { if (a[i] > maxNum) maxNum = a[i]; } return maxNum; } vector<int> solve(int* a, int aLen) { stack<int> sSort; //用来排序的栈 vector<int> ret; //用于保存排序后的数组元素 int maxNum = 0; int i = 0; int tmp = 0; while (i != aLen) { maxNum = searchMax(a + i, aLen-i); //找到数组中剩余元素的最大值maxNum while (!sSort.empty()) { tmp = sSort.top(); if (tmp > maxNum) //如果栈顶值大于maxNum,则出栈 { ret.push_back(tmp); sSort.pop(); } else break; } for (; a[i] != maxNum; i++) //此时栈顶值小于maxNum,则将该最大值之前的数全部插入栈中 { sSort.push(a[i]); } ret.push_back(maxNum); i++; } while (!sSort.empty()) //遍历完数组后,如果栈不为空,则将栈中元素全部出栈 { tmp = sSort.top(); ret.push_back(tmp); sSort.pop(); } return ret; } };