九度OJ-1525 子串逆序打印

题目描述:

小明手中有很多字符串卡片,每个字符串中都包含有多个连续的空格,而且这些卡片在印刷的过程中将字符串的每个子串都打印反了,现在麻烦你帮小明将这些字符串中的子串修正过来,同时为了使卡片美观,压缩其中的连续空格为1个。

 

输入:

输入包含多个测试用例,每个测试用例的第一行是一个正整数 n,1=<n<=100000,代表卡片上字符串的长度。第二行输入长度为n的字符串(字符串仅包含小写字母和空格)。当n为0时,代表输入结束。

 

输出:

对应每个测试用例,请按照要求输出修正过的字符串。

 

样例输入:
3
abc
13
abc   efg hij
样例输出:
cba
cba gfe jih


传送门: http://ac.jobdu.com/problem.php?pid=1525
此题有更简单的代码。我是为了练习数据结构,所以用栈做了。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define INIT_SIZE 100000
  4 #define INCREMENT 1000
  5  
  6 typedef struct SqStack
  7 {
  8     char *top;
  9     char *base;
 10     int stackSize;
 11 }SqStack;
 12  
 13 void Init(SqStack *s)
 14 {
 15     s->base = (char *)malloc(sizeof(char));
 16     if(!s->base)
 17         exit(-1);
 18     s->top = s->base;
 19     s->stackSize = 1000;
 20 }
 21  
 22 void Push(SqStack *s, char e)
 23 {
 24     //栈满,再分配内存空间
 25     if(s->top - s->base >= s->stackSize)
 26         s->base = (char *)realloc(s->base, (INCREMENT + s->stackSize) * sizeof(char));
 27     if(!s->base)
 28         exit(-1);
 29     *(s->top) = e;
 30     s->top++;
 31 }
 32  
 33 int StackLen(SqStack s)
 34 {
 35     return (s.top - s.base);
 36 }
 37  
 38 void Pop(SqStack *s, char *e)
 39 {
 40     if(s->top == s->base)
 41         return;
 42     else
 43     {
 44         s->top--;
 45         *e = *(s->top);
 46     }
 47 }
 48  
 49 int main()
 50 {
 51     int N;
 52     SqStack sta;
 53     Init(&sta);
 54     char c, tmp;
 55     while(scanf("%d", &N) != EOF)
 56     {
 57         getchar();//吃掉回车
 58         tmp = getchar();
 59         while(tmp != '\n')
 60         {   //当没有遇到空格
 61             //tmp = getchar();
 62             if(tmp == ' ')
 63             {
 64                 //遇到空格先往前处理
 65                 //如果前面有非空字符,则全部弹出
 66                 while(StackLen(sta) != 0)
 67                 {
 68                     Pop(&sta, &c);
 69                     printf("%c", c);
 70                 }
 71                 printf(" ");//输出一个空格
 72                 //再往后处理
 73                 //如果还遇到空格则继续getchar()直到一个非空字符
 74                 while((tmp = getchar()) == ' ')
 75                     continue;
 76                 if(tmp != '\n')
 77                 {
 78                     Push(&sta, tmp);
 79                     tmp = getchar();
 80                 }
 81             }
 82             else
 83             {
 84                 Push(&sta, tmp);
 85                 tmp = getchar();
 86             }
 87         }
 88         //若栈不空
 89         while(StackLen(sta))
 90         {
 91             Pop(&sta, &c);
 92             printf("%c", c);
 93         }
 94         printf("\n");
 95     }
 96     return 0;
 97 }
 98  
 99 /**************************************************************
100     Problem: 1525
101     User: zetrov
102     Language: C
103     Result: Accepted
104     Time:80 ms
105     Memory:912 kb
106 ****************************************************************/

 



posted @ 2015-03-27 00:07  zetrov  阅读(169)  评论(0编辑  收藏  举报