鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

第二十五讲 栈和队列3(视频+课件+源代码)

[复制链接]
发表于 2014-7-9 15:33:14 | 显示全部楼层
二进制转换为8进制,

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>

  4. #define STACK_INIT_SIZE 20
  5. #define STACKINCREMENT 10    //追加的空间大小
  6. typedef char ElemType;

  7. typedef struct
  8. {
  9.     ElemType *base;       //栈底
  10.     ElemType *top;        //栈顶
  11.     int stackSize;        //栈的容量
  12. }sqStack;

  13. void InitStack(sqStack *s)
  14. {
  15.     s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
  16.     if(*s->base)
  17.     {
  18.          exit(0);
  19.     }
  20.     s->top=s->base;
  21.     s->stackSize=STACK_INIT_SIZE;   //栈的容量
  22. }


  23. void Push(sqStack *s, ElemType e)     //入栈
  24. {
  25.     //如果栈满, 追加空间
  26.     if(s->top-s->base >= s->stackSize)
  27.     {
  28.         s->base=(ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
  29.         //realloc  追缴空间的函数

  30.         if(!s->base)
  31.             exit(0);
  32.         s->top=s->base+s->stackSize;
  33.         s->stackSize=s->stackSize+STACKINCREMENT;
  34.     }
  35.     *(s->top)=e;
  36.     s->top++;
  37. }

  38. void Pop(sqStack *s, ElemType *e)   //出栈
  39. {
  40.     if(s->top==s->base)
  41.         return;
  42.     *e= *--(s->top);
  43. }

  44. void ClearStack(sqStack *s)   //清空栈
  45. {
  46.     s->top=s->base;
  47. }

  48. void DestroyStack(sqStack *s)     //销毁栈
  49. {
  50.     int i, len;
  51.     len=s->stackSize;
  52.     for(i=0;i<len ;i++)
  53.     {
  54.         free(s->base);
  55.         s->base++;
  56.     }
  57.     s->base= s->top= NULL;
  58.     s->stackSize = 0;
  59. }

  60. int StackLen(sqStack s)   //计算栈的当前容量
  61. {
  62.     return(s.top-s.base);
  63. }

  64. int main()
  65. {
  66.     ElemType c, c1='0';
  67.     sqStack s, s1 ;
  68.     int len , len1, i ,j=0;
  69.     InitStack(&s);
  70.     InitStack(&s1);

  71.     printf("请输入二进制数,输入#符号表示结束!\n");
  72.     scanf("%c",&c);
  73.     while(c!='#')
  74.     {
  75.         Push(&s, c);
  76.         scanf("%c",&c);
  77.     }
  78.     getchar();   //清理键盘缓冲区, 清空#

  79.     len= StackLen(s);
  80.     printf("栈的当前容量是%d\n", len);

  81.     for(i=0;i<len; i++)
  82.     {
  83.         Pop(&s, &c);
  84.         c1=c1+(c-48)*pow(2,j);
  85.         j++;
  86.         if(j==3)
  87.         {
  88.             Push(&s1, c1);
  89.             j=0;
  90.             c1='0';
  91.         }
  92.     }
  93.     if(i==len&&j!=3)
  94.     {
  95.         Push(&s1, c1);
  96.     }

  97.     len1= StackLen(s1);

  98.     printf("新栈的当前容量是%d\n", len1);
  99.     printf("转换为八进制数是:");

  100.     for(i=0;i<len1;i++)
  101.     {
  102.          Pop(&s1, &c);
  103.         printf("%c", c);
  104.     }
  105.     printf("\n");

  106.     return 0;
  107. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2014-7-10 22:07:34 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-18 11:38:36 | 显示全部楼层
好贵啊~~~纠结
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-22 21:09:27 | 显示全部楼层
非常感谢啊,第20行有个小错,改为 if(!s->base)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-7 11:00:57 | 显示全部楼层
强烈支持楼主ing……
只是好贵T_T
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-12 10:39:54 | 显示全部楼层
没钱啊  鱼币人民币 都没有:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-14 22:38:11 | 显示全部楼层
鱼哥,我这个穷人消费不起你的课程啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-18 15:25:04 | 显示全部楼层
:sad{:1_1:}{:1_1:}{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-21 08:25:24 | 显示全部楼层
慢慢学习!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-21 09:11:57 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-12 22:01:31 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-7 23:56:04 | 显示全部楼层
有点贵啊:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-17 11:56:35 | 显示全部楼层
八进制和十进制没差太多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-20 18:08:34 | 显示全部楼层
来参考一下源代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-3 19:52:35 | 显示全部楼层
辛苦老师
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-16 19:51:51 | 显示全部楼层
好贵啊啊啊啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-16 20:28:27 | 显示全部楼层
小泉向西流 发表于 2014-7-9 15:33
二进制转换为8进制,

输出不对啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-26 02:29:29 | 显示全部楼层
自己写的二进制转换为十六进制作业代码,给各位鱼油参考一下,有更好的也可以分享一下出来
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <math.h>

  4. typedef char ElemType;  // 元素类型

  5. typedef int Status;
  6.        
  7. #define ERROR                                        0
  8. #define OK                                                1

  9. typedef struct
  10. {
  11.         ElemType *base;   // 在栈构造之前和销毁之后,base 的值为 NULL
  12.         ElemType *top;    // 栈顶指针
  13.         int stackSize;    // 当前已经分配的储存空间,以元素为单位
  14. }sqStack;


  15. #define STACK_INIT_SIZE                        100  // 储存空间初始分配量
  16. #define STACK_INCREMENT                        10   // 储存空间分配增量

  17. //初始化一个栈
  18. Status InitStack(sqStack *s)
  19. {
  20.         if( NULL == s)
  21.                 return ERROR;

  22.         s->base = (ElemType *)malloc( STACK_INIT_SIZE * sizeof(ElemType) );
  23.         if( !s->base )
  24.                 return ERROR;//exit(0);
  25.        
  26.         s->top = s->base;   // 最开始,栈顶就是栈底
  27.         s->stackSize = STACK_INIT_SIZE;

  28.         return OK;
  29. }

  30. //压入栈
  31. Status Push(sqStack *s, ElemType e)
  32. {
  33.         if( NULL == s)
  34.                 return ERROR;

  35.         //如果栈满, 追加空间
  36.         if( s->top - s->base >= s->stackSize )
  37.         {
  38.                 s->base = (ElemType *)realloc(s->base, (s->stackSize + STACK_INCREMENT)*sizeof(ElemType));
  39.                 if( !s->base )
  40.                         return ERROR;//        exit(0);

  41.                 s->top = s->base + s->stackSize;  //设置栈顶
  42.                 s->stackSize = s->stackSize + STACK_INCREMENT; //设置新的容量
  43.         }

  44.         *(s->top) = e; //写入元素
  45.         s->top++; //栈顶上移

  46.         return OK;

  47. }

  48. //弹出栈
  49. Status Pop(sqStack *s, ElemType *e)
  50. {
  51.         if( NULL == s)
  52.                 return ERROR;

  53.         if( s->top == s->base )  // 栈已空空是也
  54.                 return ERROR;
  55.        
  56.         *e = *--(s->top); //先将栈顶下移,然后取出里面的元素

  57.         return OK;
  58. }


  59. //清空栈
  60. Status ClearStack(sqStack *s)
  61. {
  62.         if( NULL == s)
  63.                 return ERROR;

  64.         s->top = s->base;
  65.         return OK;
  66. }

  67. //销毁这个栈
  68. Status DestroyStack(sqStack *s)
  69. {
  70.         int i, len;

  71.         if( NULL == s)
  72.                 return ERROR;
  73.        
  74.         len = s->stackSize;
  75.        
  76.         for( i=0; i < len; i++ )
  77.         {
  78.                 free( s->base );
  79.                 s->base++;
  80.         }
  81.        
  82.         s->base = s->top = NULL;
  83.         s->stackSize = 0;

  84.         return OK;
  85. }

  86. //计算栈的当前容量
  87. int StackLen(sqStack s)
  88. {
  89.         return(s.top - s.base);  // 初学者需要重点讲解
  90. }

  91. //若栈不空,则用e返回s的栈顶元素,并返回OK,否则返回ERROR
  92. Status GetTop(sqStack s, ElemType *e)
  93. {
  94.         //若栈不空,则用e返回s的栈顶元素,并返回OK;否则返回ERROR
  95.         if( s.base == s.top )
  96.                 return ERROR;

  97.         *e = *(s.top-1);
  98.         return OK;
  99. }


  100. int main(int argn, char* argv[], char* arge[])
  101. {
  102.         ElemType c;
  103.         sqStack s, temp;
  104.         int len, i, sum = 0, j;
  105.         int flag; //3次标识

  106.         InitStack(&s);
  107.         InitStack(&temp);

  108.         printf("请输入二进制数,输入#符号表示结束\n");  //如输入 11001001#
  109.         scanf("%c", &c);
  110. /*
  111.         请输入要查询的字母:0       
  112.         你输入的字符 0 对应的十进制数为: 48  对应的十六进制数为:30
  113.         请输入要查询的字母:1       
  114.         你输入的字符 1 对应的十进制数为: 49  对应的十六进制数为:31
  115. */
  116.         while( c != '#')
  117.         {
  118.                 Push(&s,c);
  119.                 scanf("%c", &c);
  120.         }

  121.         fflush(stdin); //把\n从缓冲区清除  getchar()也可以

  122.         len = StackLen(s);
  123.         printf("栈当前容量是: %d\n", len);

  124.         flag = 0; // 标识置0

  125.         for( i = 0,j = 0; i < len; i++ )
  126.         {
  127.                 Pop(&s,&c);
  128.                 sum = sum + (c - 48)*pow(2,j);

  129.                 if(flag == 3 || i == (len-1)) //i == (len-1)是防止循环退出前把数据压栈
  130.                 {
  131.                         Push(&temp,sum);
  132.                         sum = 0; //清空
  133.                         flag = 0; // 标识置0
  134.                         j = 0; //次方数置0
  135.                 }else
  136.                 {
  137.                         flag++; //标识递增
  138.                         j++;
  139.                 }

  140.                
  141.         }

  142.         printf("转化为十六进制数是:");
  143.        
  144.         len = StackLen(temp);

  145.         for( i = 0; i < len; i++ )
  146.         {
  147.                 Pop(&temp,&c);
  148.                 printf("%X", c);
  149.         }

  150.         //销毁栈
  151. //        DestroyStack(&s);
  152. //        DestroyStack(&temp);

  153.         printf("\n");

  154. ///////////////////////////////////////////////
  155.         system("pause");
  156.         return 0;
  157. }

复制代码


二进制转换为八进制的代码只要将里面的标识flag改为:  flag==2就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-8 09:37:02 | 显示全部楼层
强烈支持楼主ing……~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-18 15:45:44 | 显示全部楼层
强势下载了!!努力赚钱买课件!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 18:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表