1.明白题目规则
返回最小字典序
题目要求中的删除字母理解起来很容易,但是不改变原顺序和最小字典序小返回可能会误导我们.
-
1.不改变原顺序就是,在删除重复字母的同时,其他的字母顺序不能改变,打个比方就是,一群人放在一起,并把它们排列好,然后把身高一样的人给挑出去,而身高都不相同的个人则不让他们动
-
2.返回最小字典序,就是按照字典的规则,新华字典和英语字典大家都使用,字典序的规则和他们就是一样的
整个题目的意思就是把一群人放一起,挑出身高相同的人,直到支援这一个身高为止,同时这群人最后的排列方式最贴近身高从矮到高的排列方式
2.开始制定计划
-
1.栈中只存数字,遇到符号时就开始运算
-
2.栈中元素先进后出,明白计算规则
-
3.根据后缀表达式明白如何入栈弹栈和计算
-
举个例子:现在有一群人两两成双成一对,中缀表达式用这种方法来表达就是,一群人比试,比试之后才结果和定下的规则,后缀表达式则是一群人比试,先知道了结果和规则再进行比试,而这些+ - * /就是规则,所以每个符号要联系到两个数据,根据比试,先出结果的先结束,并且把结果揭示出来记录下来两个人的名单,那么这里的栈就可以当做一个记录两个人名单的一个笔记本,当两个人比赛结束,就把名单和结果给记录下来,所以每个结果和比赛的两个人是挨在一起的,因此每个运算符号,和用这个符号进行运算的数,也是挨在一起的,所以每次遇到一个运算符号就把栈顶的前两个元素弹出.
-
4.输入数据,进行程序检测和运算
3.按照框架开始写入程序
-
1.完成初始化栈的函数
-
2.完成入栈函数
-
3.完成出栈函数
-
4.完成计算函数
-
5.主函数运行
重要函数讲解
for(int i=0;i<Sl;i++) { //printf("i=%d\n",i); int index=Judge_Stack[str[i]-'a'];//为0不在栈中,为1在栈中 //printf("oouu%d",Judge_Stack[0]); if(!index)//如果此不字母在栈中,考虑是否覆盖前一个字母 { //top为栈顶指针用于判断栈中是否还有值,storage为栈,存储进栈的字母,当 while(top>=0 && storage[top]>str[i] && record_num[storage[top]-'a']>0) { //覆盖函数 [Judge_Stack[storage[top]-'a']=0; //printf(" top1=%d %c",top,storage[top]);//打印查看 top--;//先把栈顶字母删除 //printf("Ni号!"); } //再把覆盖字母引入 top++; storage[top]=str[i]; Judge_Stack[str[i]-'a']=1;//说明此字母存在于栈中 //printf(" top2=%d %c",top,storage[top]); //printf("Nihao"); } record_num[str[i]-'a']--;//每处理完一个字母该字母出现的次数就减1;
-
1.先统计输入字符中每个字母的个数,并记录下来
-
2.利用数组下标'b'-'a'转数字的特性,正好对应26个字母的顺序
-
3.建立栈,开始组织字母入栈
-
4.设计入栈规则:
-
1.如果当前输入字母不在栈中,若栈顶元素字母字典与大于当前元素且后面还会重复出现,则当前字母直接覆盖栈中元素.
-
2.如果当前字母不在栈中,若此字母只出现一次,则覆盖比自己大且还会重复出现的字母
-
3.如果当前字母在栈中,则忽略(考虑字母重复且连续)
-
-
5.完成逻辑思考