寻求最大数(二)

寻找最大数(二)

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

给你一个数字n(可能有前缀0)。

要求从高位到低位,进行 进栈出栈 操作,是最后输出的结果最大。

输入
有多组测试数据。
对于每组数据,输入一个n(0<=n<=10^100).
输出
输出栈操作后的结果。
样例输入
789
75948
样例输出
987
98457
本质上是栈贪心
思路:str保存初始数字,res为结果数组并结合top模拟栈操作,在s<strlen(str)时,从s(初始为0)开始先扫描str中还未入栈的数字,
获得最大数字对应的下标index,同时更新maxchar,然后将res数组中不小于maxchar的依次输出,接着将str扫描的起始点s到index(不包括index)中元素入res,随即在index<strlen(str)时,输出index对应的数字,并更新s为index+1,最后,在str的数字已全都入栈而栈不为空时,元素出栈直至为空
#include <stdio.h>
#include <string.h>

char str[102],res[102];
int top;

void MaxNum(){
	int s,len,index,i;
	char maxchar;
	s=0,len=strlen(str);
	while(s<len){
		maxchar='0';
		for(i=s;i<len;i++)
			if(str[i]>maxchar){
				maxchar=str[i];
				index=i;
			}
		if(maxchar=='0') index=len; //还未入栈的数字全为0
		for(i=top;i>=0;i--){
			if(res[i]>=maxchar) putchar(res[i]);//输出不小于当前最大数字的数字 
			else break;
		}
		top=i;//更新top 
		for(i=s;i<index;i++)
			res[++top]=str[i];
		if(index!=len) putchar(str[index]);//输出当前最大数字 
		s=index+1;
	}
	for(i=top;i>=0;i--)
		putchar(res[i]);
	puts("");
}

int main(){
	while(~scanf("%s",str)){
		top=-1;
		MaxNum();
	}
	return 0;
}

参照: `````````````````````````````````````````````````TC_赵坤垚``````````````````````````````````````````````````````

 
原文地址:https://www.cnblogs.com/emptyCoder/p/6533006.html