| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1839 人关注过本帖, 1 人收藏
标题:简短的代码(反序输出字符),有没有更短的?(堆栈实现的反序终于写完了,请 ...
只看楼主 加入收藏
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
结帖率:66.67%
收藏(1)
 问题点数:0 回复次数:13 
简短的代码(反序输出字符),有没有更短的?(堆栈实现的反序终于写完了,请大家指点!)
哈哈,练习一个堆栈反序输出字符的问题,用链表存储,搞了半天还报错,烦了,写个最短的。哈哈,虽然会有个 warning,不过总算运行正常。

#include <stdio.h>

main()
{
    char charr[1000];
    int i=0;
    for(i=0;(i<1000)?((charr[i]=getchar())!='\n'):0;i++);
    for(;(i>=0)?(putchar(charr[i])):0;i--);
}

命令用:gcc mainc.c -o mainc.out -std=c99
./mainc.out

当然可以小变态一下:
#include <stdio.h>

main()
{
    char charr[1000];
    int i=-1;
    for(;i++,(i<1000)?((charr[i]=getchar())!='\n'):0;);
    for(;i--,(i>=0)?(putchar(charr[i])):0;);
}

堆栈实现反序的代码终于写完了,感觉还好啦!写的冲忙,请大家指点! 编译:teststack.c stack.c可以测试下;
//stack.h

#ifndef _stack_h_
#define _stack_h_
#include <stdbool.h>
//==============================================
#define MAXSTACKITEMS 10000
//stuct stack
typedef struct stackitem{
   //TreeNode * pnode;
   //int visted;
    char ch;   //for tstack.c to test
}StackItem;

typedef struct stacknode{
    StackItem item;
    struct stacknode * next;
}StackNode;

typedef struct stack{
    StackNode * head;
    int total;
}Stack;

//function define

bool Initialize(Stack * * pstack);

bool IsFullStack(const Stack * pstack);

bool IsEmptyStack(const Stack * pstack);

bool PushIn(StackItem * pitem,Stack * pstack);

StackItem PushOut(Stack * pstack);

bool EmptyStack(Stack * pstack);

#endif


//***************************************************************************************

//stack.c

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

//=================================================
//local declear
static bool AddNode(Stack * pstack,StackNode * pnode);
static StackNode * MakeNode(StackItem * pitem);

//local function
static bool AddNode(Stack * pstack,StackNode * pnode)
{
    if(pstack!=NULL && pnode!=NULL)
    {
      pnode->next=pstack->head;
      pstack->head=pnode;
      (pstack->total)++;
      return true;
    }
    else
        return false;
}

static StackNode * MakeNode(StackItem * pitem)
{
    StackNode * temp=NULL;
    temp=(StackNode *)malloc(sizeof(StackNode));
    if(temp!=NULL)
    {
        temp->item=*pitem;
        temp->next=NULL;
        return temp;
    }
    else
        fprintf(stderr,"there is no enough mem!");
}
        
//=====================================================
//function by stack.h
bool Initialize(Stack * * pstack)
{
    *pstack=NULL;
    *pstack=(Stack *)malloc(sizeof(Stack));
    if((*pstack)!=NULL)
    {
      (*pstack)->head=NULL;
      (*pstack)->total=0;
      return true;
    }
    else
        return false;
}

bool IsFullStack(const Stack * pstack)
{
    return (pstack->total<MAXSTACKITEMS)?false:true;
}

bool IsEmptyStack(const Stack * pstack)
{
    return (pstack->total==0)?true:false;
}

bool PushIn(StackItem * pitem,Stack * pstack)
{
    return (AddNode(pstack,MakeNode(pitem)))?true:false;
}

StackItem PushOut(Stack * pstack)
{
    if(IsEmptyStack(pstack))
        fprintf(stderr,"Error! PushOut failed! no StackItem in Stack now!");
    else
    {
        StackItem titem=(pstack->head)->item;
        StackNode * tpnode=pstack->head;
        pstack->head=(pstack->head)->next;
        pstack->total--;
        free(tpnode);
        return titem;
    }
}

bool EmptyStack(Stack * pstack)
{
    int i;
    for(i=0;i < pstack->total;i++)
        PushOut(pstack);
        
    return true;
}


//*****************************************************************

//teststack.c
//print the input characters order by desc;

#include <stdio.h>
#include "stack.h"

int main()
{
    Stack * pstack=NULL;
    Initialize(&pstack);
    char ch;
    while((ch=getchar())!='\n')
    {
        StackItem pitem;
        pitem.ch=ch;
        PushIn(&pitem,pstack);
    }

    while(pstack->total > 0)
        putchar(PushOut(pstack).ch);
    return 0;
}

[ 本帖最后由 wsj3000 于 2009-8-20 02:34 编辑 ]

mainc.zip (610 Bytes)


stack.zip (1.74 KB)
搜索更多相关主题的帖子: 最短代码 
2009-08-16 17:54
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
小儿科。。

生命不熄,战斗不止.
2009-08-16 19:23
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:0 
简便是链表也能很简单的逆向输出的..以下函数就可以了...

void output(L) //L为第一个节点..
{
 if(L) {output(L->next);printf(L->data);}
}
2009-08-16 20:15
幻影天擎
Rank: 2
等 级:论坛游民
帖 子:13
专家分:13
注 册:2009-8-16
收藏
得分:0 
个位大大们``
我还刚刚开始学习`这个``
想问下`
` 最基本的得先学些什么比较适合我呢``~?????????
2009-08-16 20:28
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
#include <stdio.h>
main(int i)
{
   (i=getchar())!=10 && main(i),putchar(i);
    return 0;
}

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2009-08-16 20:29
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
收藏
得分:0 
回复 5楼 Knocker

欧拉,佩服~~~~
递归使程序更简洁,更变态......
2009-08-17 00:46
中国
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2009-1-4
收藏
得分:0 
为什么5L的程序可以反序输出啊??
谁讲解下?
2009-08-17 14:01
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:0 
这个是递归.....

(i=getchar())!=10

结束条件 i=10,也就是回车. 利用&&的判断顺序结束递归..
2009-08-17 14:11
CCVC果冻爽
Rank: 4
等 级:业余侠客
帖 子:116
专家分:209
注 册:2009-7-31
收藏
得分:0 
以下是引用Knocker在2009-8-16 20:29的发言:#include  main(int i) {    (i=getchar())!=10 && main(i),putchar(i);     return 0; }
膜拜下。太牛了!
2009-08-17 16:39
中国
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2009-1-4
收藏
得分:0 
回复 8楼 godbless

还是不懂能详细点吗?
我知道结束条件是i=10 但是i刚开始都没有赋值啊,
2009-08-18 15:26
快速回复:简短的代码(反序输出字符),有没有更短的?(堆栈实现的反序终于写完 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038816 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved