寻找最大数(二)
- 描述
-
给你一个数字n(可能有前缀0)。
要求从高位到低位,进行 进栈出栈 操作,是最后输出的结果最大。
- 输入
- 有多组测试数据。
对于每组数据,输入一个n(0<=n<=10^100). - 输出
- 输出栈操作后的结果。
- 样例输入
-
789 75948
- 样例输出
-
987 98457
思路:
贪心+栈;先找到最大的数字输出,然后再判断s1[n+1]位置的数字是否比栈顶的元素的数字大,(,要想输出的数值最大,每一位的数值都尽可能大的因为s[n+1]中存放的数字是后面的数字中最大的,语言可能能表达的有点不通顺......),如果不大,证明栈顶元素为后面元素中最大的,
输出栈顶元素,然后将栈顶元素弹出,此时栈顶元素的下一位置成为栈顶 ,在判断,,,重复上述步骤,所有元素都判断完了,将栈里面的元素按顺序输出,(也就是进栈的顺序,数字的顺序。。。)#include <iostream>,
#include <stack>
#include <cmath>
using namespace std;int main()
{
string s,s1;
stack <char>sta;
while(cin>>s)
{
s1=s;//算是一个标记数组,记录当前位置的数值为后面的位置(包含当前位置)的最大值
for(int i=0;i<s.length();i++)
for(int j=i;j<s.length();j++)
s1[i]=max(s1[i],s[j]);
for(int i=0;i<s.length();i++)//遍历整个字符串,求出最大的数
{
if(s[i]==s1[i])//如果当前的数值在后面的数值中为最大的
{
cout<<s[i];
while(!sta.empty()&&sta.top()>=s1[i+1])//判断栈顶的元素是否比下一个位置的数值大
{
cout<<sta.top();
sta.pop();
}
continue;//数字已经输出,不用再进栈
}
sta.push(s[i]);
}
while(!sta.empty())
{
cout<<sta.top();
sta.pop();
}
cout<<endl;
}
return 0;
}