HDU1062(Text Reverse)(堆栈)(耗时有点长)

HDU1062(Text Reverse)

一、首先是自己的做法
1.想法很傻瓜。就是先输入字符串,然后直接在原有的数组中进行处理,找到字符串中各个单词。通过设置flag标志,该元素为空格时flag=0,为字符且不为’\0’时flag=1。设置start与finish表示单词在数组中的起始与终止位置。从而length=finish-start+1。找到该单词位置时即可将该单词利用for循环原地翻转。通过

if ((a[k] != ' ') && (flag == 0))  

判断是否是单词的初始位置。然后利用一个for循环寻找单词的结尾位置。此处需要注意字符串的结尾为’\0’,所以用如下两行代码:

if (a[z] != ' '&&a[z]!='\0')   //最终在添加&&a[z]!='\0'条件后调试成功
if (a[z] ==' '||a[z]=='\0')

2.一些注意事项:
(1)scanf()函数使用后,因为有个’\n’残留在缓冲区内,所以先用getchar()把’\n’吞掉。
(2)scanf()函数输入字符串遇到空格会结束。所以此处选择使用gets()函数与puts()函数简化输入输出过程。
(3)使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。
(4)puts(s)的作用与语句printf("%s”,s)的作用基本相同,puts()函数只能输出字符串,不能输出数值或进行格式变换。puts()函数在输出字符串后会自动输出一个回车符。
(5)strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。

代码如下:

#include<stdio.h>
#include<math.h>
#include<string.h>

int main()
{
	char a[1000];
	int n, i;
	int m;
	char * rever(char *,int);

	while (scanf("%d", &n) != EOF)
	{
		getchar();
		for (i = 0; i < n; i++)
		{
			gets(a);    //输入该行的所有字符,gets不会受到空格影响。
			m = strlen(a);
			rever(a,m);
			puts(a);
		}
	}
	return 0;
}
char * rever(char * a,int n)
{
	int j, k, z;
	int flag,len;
	int temp;
	int start, finish;

	flag = 0;
	start = finish = 0;
	for (k = 0; k < n; k++)
	{
		if ((a[k] != ' ') && (flag == 0))  //是否是单词的起始位置
		{
			start = k;               //start的初始位置
			finish = k;
			flag = 1;
			for (z = k + 1;; z++)    //计算finish的位置
			{
				if (a[z] != ' '&&a[z]!='\0')    //最终在添加&&a[z]!='\0'条件后调试成功
				{
					finish++;
				}
				if(a[z]==' '||a[z]=='\0')
				{
					flag = 0;   //为空格或'\0'则寻找结尾结束
					k = z;      //k该位置继续开始寻找单词
					break;
				}
			}
			len = finish - start + 1;
			for (j = 0; j < (len / 2); j++)   //单词原位置倒序
			{
				temp = a[start + len - j - 1];
				a[start + len - j - 1] = a[start + j];
				a[start + j] = temp;
			}
		}
	}
	return a;
}

二、网上的第一种基本做法
1.该做法中运用变量t来控制输出格式可以借鉴学习。预设t=0。然后用if(t>0) printf(" ");就无法输出第一个空格。
2.运用两个数组,将原数组单词存入另一个数组然后翻转输出。
3.同时依旧需要注意字符串结尾是’\0’,所以有了最后一个if

if(i==len-1)

代码如下:

#include<stdio.h>  
#include<string.h>  
int main()  
{  
    int i,n,len,j,k,t;  
    char s1[1005],s2[100];  
    scanf("%d",&n);  
    getchar();  
    while(n--)  
    {  
        gets(s1);  
        len=strlen(s1);  
        for(i=0,j=0,t=0;i<len;i++)  
        {  
            if(s1[i]!=' ')  
                s2[j++]=s1[i]; /*保存单词*/  
            else  
            {  
                if(t>0) printf(" "); /*控制格式*/  
                for(k=j-1;k>=0;k--)   
                    printf("%c",s2[k]); /*反转输出*/  
                j=0;  
                t++;  
            }  
            if(i==len-1) /*反转最后一个单词,这里要特别注意*/  
            {  
                printf(" ");  
                for(k=j-1;k>=0;k--)  
                    printf("%c",s2[k]);  
            }  
        }  
        printf("\n");  
    }  
    return 0;  
}  

三、其他方法
https://www.cnblogs.com/Strugglinggirl/p/5986581.html

四、经典方法:堆栈!
将一个数组或者字符串倒置的方法,会想到运用堆栈这种数据结构!
利用堆栈后进先出的原理,逆序处理可以使用堆栈来实现。每一个单词是用空格或行结束符隔开的。每行的处理到换行符为止。

#include <stdio.h>
#define MAXSTACK 1024
 
char stack[MAXSTACK];
int pstack;
 
void push(char c)
{
    stack[pstack++] = c;
}
 
char pop()
{
    return stack[--pstack];
}
 
int main(void)
{
    int t;
    char c;
 
    scanf("%d", &t);
    getchar();
    while(t--) 
    {
        pstack = 0;   //初始栈顶指向位置
        for(;;) 
        {
            c = getchar();  //利用getchar读取数据
            if(c == ' ' || c == '\n')
            {
                while(pstack)    //遇见空格或换行就全部出栈
                    putchar(pop());
                putchar(c);
            } 
            else
                push(c);   //是字符就压栈
 
            if(c == '\n')
                break;
        }
    }
 
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值